宇宙纪元

hinder110 的思考、读书与代码札记。

0%

算法图解

 二分查找的速度比简单查找快得多。
 O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
 算法运行时间并不以秒为单位。
 算法运行时间是从其增速的角度度量的。
 算法运行时间用大O表示法表示。

这个是小结

对于这一节的理解,最好的就是,一个算法的O()的计算是执行程序次数和单次程序时间决定的。

其中呢,二分算法是很快的一种算法了,在我所学之中。

推而广之,涉及n个城市时,需要执行n!(n的阶乘)次操作才能计算出结果。因此运行时间
为O(n!),即阶乘时间。除非涉及的城市数很少,否则需要执行非常多的操作。如果涉及的城市
数超过100,根本就不能在合理的时间内计算出结果——等你计算出结果,太阳都没了

还有就是代数上给予程序执行总时间的线性变化和非线性变化。

 O(log n),也叫对数时间,这样的算法包括二分查找。
 O(n),也叫线性时间,这样的算法包括简单查找。
 O(n * log n),这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。
 O(n**2 ),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。
 O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法。


如果使用循环,程序的性能可能更高;如果使用递归,程序可能
更容易理解。如何选择要看什么对你来说更重要。

在你看来,哪种方法更容易呢?第一种方法使用的是while循环:只要盒子堆不空,就从中
取一个盒子,并在其中仔细查找。
def look_for_key(main_box):
pile = main_box.make_a_pile_to_look_through()
while pile is not empty:
box = pile.grab_a_box()
for item in box:
if item.is_a_box():
pile.append(item)
elif item.is_a_key():
print “found the key!”
第二种方法使用递归——函数调用自己,这种方法的伪代码如下。
def look_for_key(box):
for item in box:
if item.is_a_box():
look_for_key(item)
elif item.is_a_key():
print “found the key!”

其实递归我早就学习过了,这里就随便写写算了。

每个递归函数都有两部分:基线
条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则
指的是函数不再调用自己,从而避免形成无限循环。

这个说法是我很精简

def countdown(i):
print i
if i <= 0:
return
else:
countdown(i-1)

其实就是➕了if else了。

递归和栈是有很大联系的,主要是栈是入的人出,这就导致一个条件,

递归解决一个问题,要分情况要不解决,要不就是在次调用这个方法,在方法种解决问题。

这就和栈,先进入解决问题后,就倒序出栈,这就是栈和递归之间的关系。