https://pan.baidu.com/s/1pmMGoEcQspYUNc_2hmWUEg
讲解了概念,有例题,有答案,代码不算多。非常好的入门级书。图灵的书是真不错
广度优先搜索、狄克斯特拉算法、贪婪算法、动态规划、K最近邻算法、
常用算法https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/89077881
第一章:算法简介
二分查找的速度比简单查找快得多。
O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。 算法运行时间并不以秒为单位。
算法运行时间是从其增速的角度度量的。
算法运行时间用大O表示法表示。
1.1 假设有一个包含128个名字的有序列表,你要使用二分查找在其中查找一个名字,请 问最多需要几步才能找到?
7步
1.2 上面列表的长度翻倍后,最多需要几步
8步
使用大O表示法给出下述各种情形的运行时间。
1.3 在电话簿中根据名字查找电话号码。
我的答案:O(1) 书的答案:O(log n)
1.4 在电话簿中根据电话号码找人。(提示:你必须查找整个电话簿。)
O(n)
1.5 阅读电话簿中每个人的电话号码。
O(n)
1.6 阅读电话簿中姓名以A打头的人的电话号码。这个问题比较棘手,它涉及第4章的概 念。答案可能让你感到惊讶!
我的答案:O(1) 书的答案:O(n)。你可能认为,我只对26个字母中的一个这样做,因此运行时间应为O(n / 26)。需要 牢记的一条简单规则是,大O表示法不考虑乘以、除以、加上或减去的数字。下面这些 都不是正确的大O运行时间:O(n + 26)、O(n 26)、O(n * 26)、O(n / 26),它们都应表示 为O(n)!为什么呢?如果你好奇,请翻到4.3节,并研究大O表示法中的常量(常量就是 一个数字,这里的26就是常量)。
def binary_search(list, item):
low = 0
high = len(list) - 1
while low <=high:
mid_index = int((low + high)/2)
mid = list[mid_index]
if mid > item:
high = mid_index - 1
elif mid < item:
low = mid_index + 1
else:
return mid
sorted_list = [1,2,3,4,5,6,7,8,9,22,33,44,55]
print(binary_search(sorted_list, 5))
第2章 选择排序
计算机内存犹如一大堆抽屉。
需要存储多个元素时,可使用数组或链表。
数组的元素都在一起。
链表的元素是分开的,其中每个元素都存储了下一个元素的地址。
数组的读取速度很快。
链表的插入和删除速度很快。
在同一个数组中,所有元素的类型都必须相同(都为int、double等)。
?2.1 假设你要编写一个记账的应用程序。
你每天都将所有的支出记录下来,并在月底统计支出,算算当月花了多少钱。因此, 你执行的插入操作很多,但读取操作很少。该使用数组还是链表呢?
我的答案:链表
书的答案:在这里,你每天都在列表中添加支出项,但每月只读取支出一次。数组的读取速度快, 而插入速度慢;链表的读取速度慢,而插入速度快。由于你执行的插入操作比读取操作 多,因此使用链表更合适。另外,仅当你要随机访问元素时,链表的读取速度才慢。鉴 于你要读取所有的元素,在这种情况下,链表的读取速度也不慢。因此,对这个问题来 说,使用链表是不错的解决方案。
?2.2 假设你要为饭店创建一个接受顾客点菜单的应用程序。这个应用程序存储一系列点菜 单。服务员添加点菜单,而厨师取出点菜单并制作菜肴。这是一个点菜单队列:服务 员在队尾添加点菜单,厨师取出队列开头的点菜单并

最低0.47元/天 解锁文章
200

被折叠的 条评论
为什么被折叠?



