Search algorithms是最平常的算法:在某个数据结构中 查询 某个数据, 或者 search 某个值。
search 是探寻的意思,不仅可以是在已经的数据中查询某个结果,也可以是在黑暗中寻找某个答案。
search是探寻,是无数次的尝试,所以肯定是 Iterative algorithms.
1.在已知中查询某个数据。
eg:在一个字符串中查找某个字符。
def search(string,char):
for c in string:
if c == char:
return True
return False
这是最简单的算法,它的复杂度是O(n),在一般情况下这种情况还好,但是如果n非常大的时候,我们可能就需要更好的算法。
import operator
def mergeSort(strlist, compare = operator.lt):
if len(strlist) < 2:
<span style="white-space:pre"> </span>return strlist[:]<span style="white-space:pre"> </span>
mid = len(strlist) / 2
fhalf = merge<span style="font-family:Arial, Helvetica, sans-serif;">Sort[:mid]</span>
ehalf = meargeSort[mid:]
return mearge(fhalf,ehalf,compare)
</pre><pre name="code" class="python"><pre name="code" class="python">def mearge(fhalf, ehalf, compare):
res = []
i = 0
j = 0
while i < len(fhalf) and j < len(ehalf):
if fhalf[i].compare(ehalf[j]):
res.append(fhalf[i])
i += 1
else:
res.append(ehalf[j])
j += 1
if i < len(fhalf):
res.append(fhalf[i:])
if j < len(ehalf):
res.append(ehalf[j:])
return res
def search(string, char):
res = mergeSort(string)
while True:
if len(res) == 0:
return False
if len(res) == 1:
if res[0] == char:
return True
else:
return False
mid = len(res) / 2
c = res[mid]
if char < c:
res = res[:mid]
elif char > c:
res = res[mid:]
else:
return True
return False
这个算法虽然更复杂,但是它的复杂度却是O(n*lgn), 在实际使用,如果n比较小用第一种,n比较大用第二种。
2.在未知中需找答案
eg: 计算平方根
epsilon = 0.01
y = 24.0
guess = y/2.0
while abs(guess*guess - y) >= epsilon:
guess = guess - (((guess**2) - y)/(2*guess))
print(guess)
print('Square root of ' + str(y) + ' is about ' + str(guess))
遍历是一个很重要的特性。
如果一个问题太复杂那么我们就简化到能够解决为止。