目录

  • 创建随机数列
  • 顺序查找
  • 二分法查找
  • 斐波那契查找
  • 插值查找
  • 分块查找

创建随机数列

import random
import timeit
#创建随机的数列,n为数列个数,数列元素在0-1000之间
def randomList(n):iList=[]for i in range(n):iList.append(random.randrange(1000))return iList

顺序查找

查找按照操作方式分为静态查找和动态查找。静态查找只在数列中查找特定的数字,不对数列做任何修改(可以进行排序)。因此静态查找除了可以返回特对的数列是否存在,还可以返回数列中的序列号(下标)。动态查找的同时进行插入或删除的操作。因此,动态查找只能返回特定数是否存在当前数列中。

原理:顺序查找属于静态查找。为了样式统一,这里采用有序数列。从iList首个数字开始,比较查找的数字是否相等。如果相等,返回下标并退出。否则比较下一个数字。

利用上节排序算法先将数列排序,这里选用快速排序:

def quickSort(iList):if len(iList) <= 1:return iListleft = []right = []for i in iList[1:]:if i <= iList[0]:left.append(i)else:right.append(i)return quickSort(left) + [iList[0]] + quickSort(right)

顺序查找

iList = quickSort(randomList(20))
def sequentialSearch(iList, key):print("iList = %s" %str(iList))print("Find The number : %d" %key)iLen = len(iList)for i in range(iLen):if iList[i] == key:return ireturn -1if __name__ == "__main__":keys = [random.choice(iList), random.randrange(min(iList), max(iList))]for key in keys:res = sequentialSearch(iList, key)if res >= 0:print("%d is in the list, index is : %d\n" %(key, res))else:print("%d is not in the list\n" %key)

二分法查找

原理:直接用数列中的中间位置的数与查找树进行比较,如果该数比查找数大,则在该数的左侧继续取中间数直到找到为止。

二分法查找

iList = quickSort(randomList(20))def binarySearch(iList, key):print("iList = %s" %str(iList))print("Find The number : %d" %key)iLen = len(iList)left = 0 right = iLen -1while right - left > 1:mid = (left + right) // 2if key < iList[mid]:right = midelif key > iList[mid]:left = midelse:return midif key == iList[left]:return leftelif key == iList[right]:return rightelse:return -1if __name__ == "__main__":keys = [random.choice(iList), random.randrange(min(iList), max(iList))]for key in keys:res = binarySearch(iList, key)if res >= 0:print("%d is in the list, index is : %d\n" %(key, res))else:print("%d is not in the list\n" %key)

斐波那契查找

原理:与二分法思路一样,只是取数位置发生了变化,每次选取比较的数的位置在0.618位置。需要先提供一个与数列对应的斐波那契数列,作为选数时的参考。
斐波那契数列:F(1)=1,F(2)=1,F(N)=F(n-1),F(n-2)(n>=2)
首次选取得斐波那契数列要比查找数列得长度稍大,而比较点为斐波那契数列的倒数第二位数a为下标的位置,即iList[a]。然后进行比较,比较结束后按照新得数列长度继续重新选取斐波那契数,直到结束。

斐波那契查找

iList = quickSort(randomList(20))def fibonacci(n):'''return the last element of the fibonacci sequence'''fList = [1, 1]while n > 1 :fList.append(fList[-1] + fList[-2])n -= 1return fList[-1]def fibonacciSearch(iList, key):print("iList = %s" %str(iList))print("Find The number : %d" %key)iLen = len(iList)left = 0 right = iLen - 1indexSum = 0k = 1while fibonacci(k) -1 < iLen - 1: #fibonacci数列中的最后一个元素要比iList的长度稍微大一点k += 1while right - left > 1:mid = left + fibonacci(k - 1)if key < iList[mid] :right = mid - 1k -= 1elif key == iList[mid]:return midelse:left = mid + 1k -= 2if key == iList[left]:return leftelif key == iList[right]:return rightelse:return -1if __name__ == "__main__":keys = [random.choice(iList), random.randrange(min(iList), max(iList))]for key in keys:res = fibonacciSearch(iList, key)if res >= 0:print("%d is in the list, index is : %d\n" %(key, res))else:print("%d is not in the list\n" %key)

插值查找

原理:与二分法、斐波那契相比,插值查找选取得比较位置更接近该数实际得位置,但是当数列中的数分布的比较广的情况下插入查找的效果不好。

插值查找

iList = quickSort(randomList(20))def insertSearch(iList, key):print("iList = %s" %str(iList))print("Find The number : %d" %key)iLen = len(iList)left = 0 right = iLen -1while right - left > 1:mid = left + (key - iList[left]) * (right - left) // (iList[right] - iList[left])if mid == left:mid += 1 #当iList[right]和iList[left]相差太大时,有可能导致mid一直都等于left,从而陷入死循环if key < iList[mid]:right = midelif key > iList[mid]:left = midelse:return midif key == iList[left]:return leftelif key == iList[right]:return rightelse:return -1if __name__ == "__main__":keys = [random.choice(iList), random.randrange(min(iList), max(iList))]for key in keys:res = insertSearch(iList, key)if res >= 0:print("%d is in the list, index is : %d\n" %(key, res))else:print("%d is not in the list\n" %key)

分块查找

原理
分块查找与上述的几种查找方式有所不同:顺序查找是可以无序的,而二分法和斐波那契查找是有序的,分块查找介于两者之间,需要块有序,元素可以无序。先将数列分块,先将查找数定位到所属块中,然后进行顺序查找。

分块查找

iList = randomList(20)
indexList = [[250, 0], [500, 0], [750, 0], [1000, 0]]def divideBlock():global iList, indexList sortList = []for key in indexList:subList = [i for i in iList if i < key[0]] #列表推导, 小于key[0]的单独分块key[1] = len(subList)sortList += subList iList = list(set(iList) - set(subList)) #过滤掉已经加入到subList中的元素iList = sortListprint()return indexListdef blockSearch(iList, key, indexList):print("iList = %s" %str(iList))print("indexList = %s" %str(indexList))print("Find The number : %d" %key)left = 0 #搜索数列的起始点索引right = 0 #搜索数列的终点索引for indexInfo in indexList:left += rightright += indexInfo[1]if key < indexInfo[0]:breakfor i in range(left, right):if key == iList[i]:return ireturn -1if __name__ == "__main__":print(iList)divideBlock()print(iList)keys = [random.choice(iList), random.randrange(min(iList), max(iList))]for key in keys:res = blockSearch(iList, key, indexList)if res >= 0:print("%d is in the list, index is : %d\n" %(key, res))else:print("%d is not in the list\n" %key)

查找——顺序、二分法、斐波那契、插值、分块相关推荐

  1. 我所知道查找算法之斐波拉契(黄金分割法)查找

    作者前言 大家好,我是阿濠,今篇内容跟大家分享的是查找算法之斐波那契(黄金分割法)查找,很高兴分享到segmentfault与大家一起学习交流,初次见面请大家多多关照,一起学习进步. 一.斐波那契数列 ...

  2. 查找算法:斐波那契查找算法实现及分析

    斐波那契查找算法介绍 斐波那契查找法肯定与斐波那契相关嘛,斐波那契数列 又称黄金分割数列.所以我们先把黄金分割弄懂,后面代码才能看得懂!黄金分割点大家都知道吧.1:0.618或者1.618:1,我们的 ...

  3. 【数据结构与算法】插值查找算法、斐波那契查找算法(黄金分割法)的介绍和程序实现

    目录 1. 插值查找算法 1.1 插值查找算法的介绍 1.2 插值查找算法的程序实现 2. 斐波那契查找算法 2.1 斐波那契查找算法的介绍 2.2 斐波那契查找算法的程序实现 1. 插值查找算法 1 ...

  4. 查找算法之斐波那契查找算法

    斐波那契(黄金分割法)查找算法 (一)算法简介 (1)斐波那契数列 在讲算法之前,我们先介绍一下斐波那契数列,该数列公式为F(K) = F(k-1) + F(k-2),即 1.1.2.3.5.8.13 ...

  5. python输入n个数、输出最小的数字_程序查找最少的斐波纳契数以在Python中加到n?...

    假设我们有一个数字n:我们必须找到加n所需的最小斐波纳契数. 因此,如果输入像n = 20,那么输出将为3,因为我们可以使用斐波那契数[2,5,13]求和为20. 为了解决这个问题,我们将按照以下步骤 ...

  6. java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...

    顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...

  7. 对长度为200的有序表进行二分查找_程序员常用的查找算法(顺序、二分、插值、分块、斐波那契)...

    顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...

  8. Java数据结构之二分查找/插值查找/斐波那契查找

    目录 一.简单的线性查找 1.问题引出 2.代码实现 二.二分查找算法 1.基本介绍 2.代码实现(递归) 3.代码实现(非递归) 4.二分查找的功能完善 三.插值查找 1.简单介绍 2.代码实现(递 ...

  9. 斐波那契(黄金分割)法查找:

    斐波那契(黄金分割法)查找算法: 斐波那契(黄金分割法)原理:**斐波那契查找**原理与前两种相似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值位于黄金割点附近,即==**mid=low ...

  10. C++实现斐波那契查找(附完整源码)

    C++实现斐波那契查找 构造一个斐波那契数组完整源码 斐波那契查找完整源码 构造一个斐波那契数组完整源码 #include "stdafx.h" #include <memo ...

最新文章

  1. 美国北卡教堂山分校Jeff Dangl组植物微生物组博士后招聘(植物微生物互作领域第一高引学者)...
  2. zookeeper 分布式计数器
  3. Python练习_三级菜单
  4. 编程之美-构造数独(1)
  5. ue4加载本地版本_【虚幻4】创建本地数据库
  6. 包python_Python 包:
  7. 【报错】ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds t
  8. npm install mysql --save-dev
  9. 有关EnableQ在线问卷调查引擎的记者访谈记录
  10. 利用NCO 3.0 调用SAP中的函数
  11. bzoj 3357: [Usaco2004]等差数列(DP+map)
  12. echart添加点击跳转链接事件多次跳转的问题
  13. 《疯狂的程序员》 -- 什么是真正的程序员?
  14. emoji 表情图片解决方法
  15. html img标签的alt属性和title属性(说明)
  16. c语言 统计数量用count_C语言中count是什么意思?
  17. 不浪费原料的汉堡制作方案--贪心算法
  18. 用了这么久开源社区,还搞不明白免费/自由/开源软件?
  19. list和set集合的遍历
  20. 梯度下降法,二维空间三维空间 代码实现

热门文章

  1. java -jar 指定端口_「Linux命令」-Java程序员需要掌握的10个命令
  2. OpenCV:利用python来实现图像的直方图均衡化
  3. nlp-tutorial代码注释1-1,语言模型、n-gram简介
  4. 实验5.4 编程实现两字符串的连接(使用string类定义字符串对象)
  5. 最急救助(【CCF】NOI Online能力测试3 入门组)
  6. OpenCV——解决使用rectangle()函数时出现“TypeError: function takes exactly 4 arguments (2 given)”错误
  7. 机器学习 Machine Learning中正则化的学习笔记~
  8. Freemarker简单封装
  9. 【机房收费系统】---导出Excel表
  10. Node.js 初步学习总结