首页 > 编程语言 >【数据结构和算法】搜索算法

【数据结构和算法】搜索算法

时间:2023-12-06 17:37:30浏览次数:27  
标签:__ self 搜索算法 列表 算法 数据结构 lyst def

① 搜索最小值

python的min函数返回列表中的最小项

1 def indexOfMin(lyst):
2     minIndex = 0
3     currentIndex = 1
4     while currentIndex < len(lyst):
5         if lyst[currentIndex] < lyst[minIndex]:
6             minIndex = currentIndex
7         currentIndex += 1
8     return minIndex

算法复杂度为O(n)

② 顺序搜索一个列表

python的in运算符作为list类中名为__contains__的一个方法实现的。

1 def sequentialSearch(target,lyst):
2     position = 0
3     while postion < len(position):
4         if target == lyst[position]:
5             return position
6         position += 1
7     return -1

最好情况、最坏情况和平均情况的性能

顺序搜索的分析要考虑如下三种情况:

1.在最坏的情况下,目标位与列表的末尾,或者根本不在列表内,那么算法必须访问每一个项,并对大小为n的列表执行n次迭代,因此顺序搜索的最坏的复杂度为O(n)

2.在最好的情况下,算法只进行了1次迭代就在第一个位置找到目标项,复杂度为O(1)

3.要确认平均情况,把每个可能的位置找到目标项所需的迭代次数相加,并用总和除以n,因此算法执行了(n+1)/2次的迭代,对于很大的n来说,常数因子2的作用并不大,因此平均情况的复杂度仍然为O(n)

③ 有序列表的二叉搜索

 1 def binarySearch(target,sortedLyst):
 2     left = 0
 3     right = len(sortedLyst) - 1
 4     while left <= right:
 5         middle = (left + right)//2
 6         if target == sortedLyst[middle]:
 7             return middle
 8         elif target < sortedLyst[middle]:
 9             right = middle - 1
10         else:
11             left = middle + 1
12     return -1

二叉搜索的最坏情况的复杂度为O(log2n)

二叉搜索可能比顺序搜索要更为高效,然而选择何种搜索算法取决于列表中的数据组织方式

④ 比较数据项

二叉搜索的搜索最小项,都是假设列表中的项是可以相互比较的,在python中这意味着这些项具有相同的数据类型,并且它们都识别比较运算符==,<和>。几个内建的python类型的对象,例如数字、字符串和列表,都可以用这些运算符来进行比较

为了允许算法对一个新对象的类使用比较运算符,应该在该类中定义__eq__,__lt__和__gt__方法。__lt__方法:

def __lt__(self,other):

如果self小于other,该方法返回True,否则返回False。

 1 class SavingAccount(object):
 2     def __init__(self,name,pin,balance=0.0):
 3         self._name = name
 4         self._pin = pin
 5         self._balance = balance
 6 
 7     def __lt__(self,other):
 8         return self._name < other._name
 9 
10 
11 s1 = SavingAccount('Ken',"1000",0)
12 s2 = SavingAccount('Bill',"1001",30)
13 print(s1<s2) #False
14 print(s1>s2) #True
15 print(s1==s2) #False
16 
17 s3 = s1
18 print(s3==s1) #True

当字符串应用<运算符的时候,python自动运行__lt__方法,就像在调用str函数运行__str__方法一样

总结:

1.搜索最小项算法必须访问列表的每一个数,除非列表已经排序,因此算法总是线性的,因此最好的情况,最坏的情况和平均的情况的性能都是O(n)

2.顺序搜索最好的情况性能是O(1),最坏的情况是O(n),平均情况(1+2+...+n)/n或2/n,因此平均情况下算法的性能是O(n)

标签:__,self,搜索算法,列表,算法,数据结构,lyst,def
From: https://www.cnblogs.com/huangm1314/p/10928028.html

相关文章

  • 【数据结构和算法】排序算法
    使用swap函数来交换列表中的两项的位置1defswap(lyst,i,j):2'''交换列表中两项的位置'''3temp=lyst[i]4lyst[i]=lyst[j]5lyst[j]=temp①选择排序处于列表第一项,先找到最小项的位置,如果该位置不是列表的第一项,算法会交换这两个位置的项,然后......
  • 路径规划算法 - 求解最短路径 - Dijkstra算法
    Dijkstra算法的思想是广度优先搜索(BFS)贪心策略。是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数如果是负数,则需要Bellman-Ford算法如果想求任意两点之间的距离,就需要用Floyd算法求节点0->4的最短路径每次从未标记的节点中选择距离......
  • 拒绝算法推荐,使用rss订阅消息与新闻!
    算法推荐的弊端就不说了借用RSSHub镜像网站如果你实在不会,又或者觉得麻烦,那你还可以搭其他网友的“便车”。我收集了 9 个公开的 RSShub镜像网站,它们用的都是用自己的服务器,所以在流量方面也不会有问题。服务器1 :https://rsshub.rssforever.com 服务器2 :https://rss......
  • java与算法Day1 Scanner的应用(一)
    java中使用输入需要用到java.util.Scanner。Scanner有next,nextInt,nextString,hasNext,hasNextLine等方法。使用XXX variable=Scanner.NextXXX就可以获取一个输入值。next系列的方法,他们的作用都是从键盘中接收数据。当程序执行到他们的时候,在命令行中就开始等待键盘输入了,而......
  • 文心一言 VS 讯飞星火 VS chatgpt (130)-- 算法导论11.2 2题
    二、用go语言,对于一个用链接法解决冲突的散列表,说明将关键字5,28,19,15,20,33,12,17,10插入到该表中的过程。设该表中有9个槽位,并设其散列函数为h(k)=kmod9。文心一言:在这个问题中,我们使用Go语言来解决一个散列(Hash)表的问题,该问题需要我们使用链接法解决冲突。我们的散列......
  • 文心一言 VS 讯飞星火 VS chatgpt (129)-- 算法导论11.1 4题
    四、用go语言,我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典。开始时该数组中可能包含一些无用信息,但要对整个数组进行初始化是不太实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典的方案。每个存储对象占用O(1)空间;SEARCH、INSERT和DELETE操......
  • Xlinx FPGA for DSP CORDIC 算法
    https://wenku.baidu.com/view/6c623aa8910ef12d2bf9e732.html?_wkts_=1701401816748&needWelcomeRecommand=1           ......
  • 2023/12/5日 学习Java数据结构
    今日学习了单链表和一部分的双向链表,还有一个月的时间就要期末考试了,但是我的数据结构还是一点也不会,只能抓紧学了packagecom.ityuhao;importjavax.swing.*;publicclassLinkList{//头节点privateNodehead;//链表长度publicintlength;//创......
  • 单调栈与单调队列算法总结
    单调栈知识概览单调栈最常见的应用是找到每一个数离它最近的且比它小的数。单调栈考虑的方式和双指针类似,都是先想一下暴力做法是什么,然后再挖掘一些性质如单调性,最终可以把目光集中在比较少的状态中,从而达到降低时间复杂度的作用,都是算法优化的一种手段。对于的情况,更有可能......
  • 代码随想录算法训练营第六天| 454.四数相加 15.三数之和 18.四数之和
    LeetCode454.四数相加题目链接:LeetCode454思路: 将两个数组中的数存放到一个map中,用另外两个数组的值在map中去减 classSolution{public:intfourSumCount(vector<int>&A,vector<int>&B,vector<int>&C,vector<int>&D){unordered_map&l......