||
简单起见,每个函数处理一个整数序列,列表以参数的形式传递给函数。
一、搜索最小值
给定一个列表,不为空,其中项的顺序是任意的,找到其最小值,并返回其索引。(该函数为python中min的代替版本)该函数的需要的比较的次数为n-1.(n为列表的长度)
#搜索最小值
def indexOfMin(lyst):
minIndex=0
currentIndex=1
while currentIndex<len(lyst):
if lyst[currentIndex]<lyst[minIndex]:
minIndex=currentIndex
currentIndex += 1
return minIndex
二、顺序搜索一个列表
该方法在列表(无序)中搜索一个特定的项,从第一个项的位置开始,将其与目标项进行比较,如果两个项相同则返回true,否则移到下一个位置进行比较返回,直到最后一个位置,若仍然没找到目标项则返回false。这种搜索成为顺序搜索。
#顺序搜索
def sequentialSearch(target,lyst):
position=0
while position < len(lyst):
if target == lyst[position]:
return 1
position += 1
return -1
算法的性能取决于所处理数据的放置方式,通常考虑算法的平均性能和最坏情况的性能
1、最坏情况,目标项位于列表末尾,或者不在列表中,需要迭代n次;
2、最好情况,目标项位于列表第一个位置,只需一次迭代;
3、平均情况,目标项出现在每个位置的概率相同,则平均需要(n+1)/2次迭代;
三、二分查找
对于无序列表顺序搜索是必要的,当搜索有序列表时,可以使用二分查找。其思路为:首先假设列表中的项都是升序排列,然后直接找到列表中间位置,并将该位置的项与目标项进行比较,如果一致则返回该位置;否则目标小于当前项则搜索列表中间位置以前的部分;如果目标大于当前项则搜索列表中间位置以后的部分。当找到目标或当前的开始位置比当前结束位置要大时,停止搜索。
(python3以上版本,“/”为浮点数除法,返回浮点数;“//”为整数除法,返回整数)
#二分查找
def binarySearch(target,sortedLyst):
left=0
right=len(sortedLyst)-1
while left<right:
mid=(left+right)//2
if target == sortedLyst[mid]:
return mid
elif target<sortedLyst[mid]:
right=mid - 1
else:
left=mid + 1
return -1
当目标不在该列表中该算法出现最坏的情况,此时列表长度n/2/2/2/……=1时迭代停止,迭代次数为k,k满足2的k次方等于n,所以最坏的情况是log(n)。
二分搜索可能比顺序搜索更为高效,选取何种算法,取决于列表中的数据组织形式。对于二叉树有一个额外的整体性代价,就是必须保持列表有序。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-16 10:34
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社