算法必须符合有穷能运行,有一些人类可以解决但是计算机无法解决的问题
分工不同,做底层的给你提供算法结构,函数结构,普通程序员可以调用实现功能,但是底层程序员可以不断优化函数内部实现,你外部只管调用就行了,不用关注里面是怎么实现的。
算法是逻辑层面上的,程序运行时物理层面上的。
(1)简单括号的匹配
(2)复杂括号匹配
(3)十进制二进制转换
二进制转为十进制,就是看位数,2**(n-1),对每个位置上的树相加
十进制转二进制,就是每次都除以2求余数
十进制转二进制
下面以list的右边作为队首,如果以左边的话用append等函数即可
列表实现的话存储位置是连续的
这样存储位置不连续,可以实现插入复杂度为O(n)
(1)节点的实现
(2)链表的实现,主要是注意头节点和尾节点
比如各个省由省长管理,分成各个县,县长管理
递归算法是一种典型的分治策略算法
动态规划表格,行好i代表宝物id号,列号代表限制的重量,单元格表示价值,是前i个里面选一个的最大值
每一趟排序一次,需要n-1躺
同时每趟要执行n-已跑趟数
所有需要两个for循环
先拿出第一个作为子列,然后看第二个应该放到第一个前面还是后面
总之先外层循环一轮,拿出第k个值,然后内层循环,把拿出的这个值和前面拍好序的值比较,看看该放到哪里。
和我们打牌时整理牌的过程几乎一样
因为插入排序的话,如果是已经排序好的,那执行速度就快。
希尔排序把整个列表先分成几个小部分,小部分排序好之后,再进行整体排序
堆排序就是用后面的二叉堆进行排序
我们最重要的是找到数据储存的位置,这样知道位置直接查找就很简单了。
哈希表就是需要将数据和位置对应,知道数据了就能推出它的位置。
(1)散列
(2)散列函数
(3)负载因子
散列值生成很快,但是你需要在在全网同步,所以需要控制区块生成的速度。
(1)线性探测
(2)数据项链
key是用哈希表存储的,data和key位置对应,找到key就能找到data
任何一条路径是排序好的,不同的路径不是排好序的
二叉堆的关键就是任何节点的父节点都比它小
为了方便查找,对二叉树进行特殊的编排的二叉树
二叉查找树的实现
(1)无向图
(2)有向无环图
(3)有向带环图
工程问题用拓扑排序,用有向无环图解决。
(1)栈的实现
(2)队列的实现
(3)双向队列
(4)单向链表(节点和链表两个class,注意头节点和尾节点)
(5)双向链表的实现
(6)递归的实现,进行列表的相加
(7)递归实现找零问题以及改进代码
https://www.bilibili.com/video/BV1VC4y1x7uv?p=41
(8)动态规划实现博物馆大盗的问题
(9)顺序查找的while实现
(10)二分查找
(11)二分查找的递归实现
(12)冒泡排序
(13)选择排序
(14)插入排序
(15)希尔排序
(16)归并排序
(17)快速排序
(18)树的列表实现
(19)树的链表实现
(20)树的三种遍历方式,使用外部函数的方法
(21)树的三种遍历方式,使用类内部函数的方法
(22)二叉堆
(23)二叉查找树
(24)平衡二叉树
(25)图的实现
(26)词梯问题(最短路径)
(27)骑士周游
(28)广度搜索
(29)深度搜索
(30)最短路径
(31)拓扑排序算法
(32)最小生成树
(1)不同算法有不同优势,看你实际应用,要相互匹配
(2)解决算法题,先找到解决思路,不要先编程,有了思路和步骤以后再去编程实现。
(3)启发式规则在算法中加入一些人为的调整规定,缩短搜索时间和算法时间。
(4)刷题,刷题就是数据结构
【1】非常好:【北京大学】数据结构与算法Python版(完整版)_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1VC4y1x7uv?p=7&spm_id_from=pageDriver
[2] 一些算法的可视化过程
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html