返回顶部
首页 > 资讯 > 后端开发 > Python >python中搜索的示例分析
  • 305
分享到

python中搜索的示例分析

2023-06-22 05:06:24 305人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章将为大家详细讲解有关python中搜索的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 普通搜索搜索是指从元素集合中找到某个特定元素的算法过程。搜索过程通常返回 True 或 Fals

这篇文章将为大家详细讲解有关python中搜索的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    1. 普通搜索

    搜索是指从元素集合中找到某个特定元素的算法过程。搜索过程通常返回 True 或 False, 分别表示元素是否存在。
    Python中提供了 in 方法可以判断元素是否存在列表中:

    # python提供in函数进行搜索a=[3,4,5,8,'t']'t' in a9 in a

    结果如下:

    python中搜索的示例分析

    2. 顺序搜索

    顺序搜索故名思义:从列表中的第一个元素开始,沿着默认的顺序逐个查看, 直到找到目标元素或者查完列表。如果查完列表后仍没有找到目标元素,则说明目标元素不在列表中。

    顺序搜索过程:

    python中搜索的示例分析

    1.1 无序下的顺序查找

    无序下的顺序搜索很有特点,列表无序,只好一个一个去比较,寻找元素。

    #顺序查找def sequentialsearch(testlist,item):    pos=0    found=False    while pos<len(testlist) and not found:        if testlist[pos]==item:            found=True        else:            pos=pos+1    return found

    结果如下:

    python中搜索的示例分析

    分析一下这种顺序查找,这种查找方式,最好的方式就寻找一次就成功了,最坏的情况的需要查找n次,于是时间复杂度是O(n)

    1.2 有序下的顺序查找

    有序下的顺序查找就是所查找的列表是有序的,

    # 有序下的顺序搜索def ordersearch(testlist,item):    pos=0    found=False    stop=False    while pos<len(testlist) and not found and not stop:        if testlist[pos]==item:            found=True        else:            if testlist[pos]>item:                stop=True            else:                pos=pos+1    return found

    结果如下:

    python中搜索的示例分析

    分析一下这种搜索方法,正常情况下来说,最好情况下,搜索1次就能成功,最差情况只需要n/2次即可搜索完成,但时间复杂度依旧是O(n),只有当列表中不存在目标元素时,有序排列的元素才会提高顺序搜索的效率。

    2.二分查找

    二分查找:是利用列表有序的这个原理,从中间的元素着手。如果这个元素就是目标元素,那就立即停止搜索;如果不是,则可以利用列表有序的特性,排除一半的元素。如果目标元素比中间的元素大,就可以直接排除列表的左半部分和中间的元素。这是因为,如果列表包含目标元素,它必定位于右半部分。

    在有序整数列表中进行二分搜索:

    python中搜索的示例分析

    二分查找实现方式:

    def binarysearch(testlist,item):    testlist.sort()#排序    left=0#左指针    right=len(testlist)-1#右指针    found=False    while left<=right and not found:        mid=(left+right)//2#取中间值        if testlist[mid]==item:            found=True        else:            if testlist[mid]<item:                left=mid+1            else:                right=mid-1    return found

    看看效果:

    python中搜索的示例分析

    二分查找递归实现:

    def binarysearch3(testlist,item):     if len(testlist) == 0:         return False      else:         mid = len(testlist) // 2         if testlist[mid] == item:             return True         else:             if item < testlist[mid]:                 return binarysearch3(testlist[:mid], item)             else:                 return binarysearch3(testlist[mid+1:], item)

    看看效果:

    python中搜索的示例分析

    总结一下二分查找:在进行二分搜索时,每一次比较都将待考虑的元素减半,。那么,要检查完整个列表,二分搜索算法最多要比较多少次呢?假设列表共有 n 个元素,第一次比较后剩下n 个元素,第 2 次比较2后剩下n /4个元素,接下来是n/8 ,然后是n/16 ,依此类推。列表能拆分多少次?

    二分搜索算法的表格分:

    python中搜索的示例分析

    拆分足够多次后,会得到只含一个元素的列表。这个元素要么就是目标元素,要么不是。无论是哪种情况,计算工作都已完成。要走到这一步,需要比较 i 次,其中n 2 i {n}\over{2^i}
    2
    i
     
    n

     =1 。由此可得比较次数的最大值与列表的元素个数是对数关系。所以,二分搜索算法的时间复杂度是O ( l o g 2 n ) O(log_2 n)O(log
    2

     n)。

    3.散列查找

    散列查找:通过散列构建一个时间复杂度为 O(1)的数据结构。我们平常听的最多哈希表就是散列的一种方式。
    散列表:散列表是元素集合,其中的元素以一种便于查找的方式存储。散列表中的每个位置通常被称 为槽,其中可以存储一个元素。槽用一个从 0 开始的整数标记,例如 0 号槽、1 号槽、2 号槽, 等等。初始情形下,散列表中没有元素,每个槽都是空的。可以用列表来实现散列表,并将每个元素都初始化为 Python 中的特殊值 None。下图展示了大小 m 为 11 的散列表。也就是说,表中有 m 个槽,编号从 0 到 10。

    有11 个槽的散列表:

    python中搜索的示例分析

    散列函数:将散列表中的元素与其所属位置对应起来。对散列表中的任一元素,散列函数返回 一个介于 0 和 m – 1 之间的整数。假设有一个由整数元素 54、26、93、17、77 和 31 构成的集 合。首先来看第一个散列函数,它有时被称作“取余函数”,即用一个元素除以表的大小,并将 得到的余数作为散列值(h(item) = item%11)。下图给出了所有示例元素的散列值。取余函数是一个很常见的散列函数,这是因为结果必须在槽编号范围内。

    使用余数作为散列值:

    python中搜索的示例分析

    计算出散列值后,就可以将每个元素插入到相应的位置,如图 5-5 所示。注意,在 11 个槽 中,有 6 个被占用了。占用率被称作载荷因子,记作λ \lambdaλ,定义如下:

    python中搜索的示例分析

    有 6 个元素的散列表:

    python中搜索的示例分析

    3.1 几种散列函数

    给定一个元素集合,能将每个元素映射到不同的槽,这种散列函数称作完美散列函数。如果元素已知,并且集合不变,那么构建完美散列函数是可能的。不幸的是,给定任意一个元素集合,没有系统化方法来保证散列函数是完美的。所幸,不完美的散列函数也能有不错的性能。

    • 折叠法:先将元素切成等长的部分(最后一部分的长度可能不同),然后将这些部分相加,得到散列值。假设元素是电话号码 436-555-4601,以 2 位为一组进行切分,得到 43、65、55、46 和 01。将这些数字相加后,得到 210。

    • 平方取中法:先将元素取平方,然后提取中间几位数。如果元素是 44,先计算 442=1936,然后提取中间两位 93,继续进行取余的步骤。

    • 字符编码:采用python中的ord函数将单词“cat”看作序数值序列,再将这些序数值相加,并采用取余法得到散列值。

    3.2 处理散列表冲突

    完美的散列表,一个元素只对应着一个卡槽,可是如果当2个元素被分配到一个卡槽时,必须通过一种系统化方法在散列表中安置第二个元素。这个过程被称为处理冲突。

    开发定址法:在散列表中找到另一个空槽,用于放置引起冲突的元素。简单的做法是从起初的散列值开始,顺序遍历散列表,直到找到一个空槽。注意,为了遍历散列表,可能需要往回检查第一个槽。(例如:将(54, 26, 93, 17, 77, 31, 44, 55, 20)放入卡槽中。)

    python中搜索的示例分析

    再散列:采用“加 3”探测策略处理冲突后的元素分布情况。发生冲突时,为了找到空槽,该策略每次跳两个槽。

    python中搜索的示例分析

    平方探测:线性探测的一个变体,它不采用固定的跨步大小,而是通过再散列函数递增散列 值。如果第一个散列值是 h,后续的散列值就是 h+1、h+4、h+9、h+16,等等。换句话说,平方探测的跨步大小是一系列完全平方。

    python中搜索的示例分析

    链接法:允许散列 表中的同一个位置上存在多个元素。发生冲突时,元素仍然被插入其散列值对应的槽中。不过, 随着同一个位置上的元素越来越多,搜索变得越来越困难。

    python中搜索的示例分析

    3.3 散列表的实现(加1重复)

    哈希散列的实现:

    #哈希表class HashTable:    def __init__(self):         self.size = 11         self.slots = [None] * self.size         self.data = [None] * self.size    def put(self, key, data):         hashvalue = self.hashfunction(key, len(self.slots))         if self.slots[hashvalue] == None:             self.slots[hashvalue] = key            self.data[hashvalue] = data         else:             if self.slots[hashvalue] == key:                 self.data[hashvalue] = data #替换             else:                 nextslot = self.rehash(hashvalue, len(self.slots))                 while self.slots[nextslot] != None and self.slots[nextslot] != key:                     nextslot = self.rehash(nextslot, len(self.slots))                if self.slots[nextslot] == None:                     self.slots[nextslot] = key                     self.data[nextslot] = data                else:                     self.data[nextslot] = data #替换     def hashfunction(self, key, size):         return key%size     def rehash(self, oldhash, size):         return (oldhash + 1)%size#get函数    def get(self, key):         startslot = self.hashfunction(key, len(self.slots))         data = None         stop = False         found = False         position = startslot        while self.slots[position] != None and not found and not stop:             if self.slots[position] == key:                 found = True                 data = self.data[position]             else:                  position=self.rehash(position, len(self.slots))                 if position == startslot:                     stop = True                     return data     def __getitem__(self, key):         return self.get(key)     def __setitem__(self, key, data):         self.put(key, data)

    结果如下:

    python中搜索的示例分析

    我们分析一下散列查找:在最好情况下,散列搜索算法的时间复杂度是 O(1),即常数阶。但可能发生冲突,所以比较次数通常不会这么简单。

    关于“python中搜索的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    --结束END--

    本文标题: python中搜索的示例分析

    本文链接: https://lsjlt.com/news/302542.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • python中搜索的示例分析
      这篇文章将为大家详细讲解有关python中搜索的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 普通搜索搜索是指从元素集合中找到某个特定元素的算法过程。搜索过程通常返回 True 或 Fals...
      99+
      2023-06-22
    • python模块中搜索路径的示例分析
      小编给大家分享一下python模块中搜索路径的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python有哪些常用库python常用的库:1.reques...
      99+
      2023-06-14
    • CentOS中搜索命令的示例分析
      这篇文章将为大家详细讲解有关CentOS中搜索命令的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。windows下在找不到一下文件啊等等我们都会使用一些搜索命令,帮助自己来找到想要的东西。linu...
      99+
      2023-06-10
    • HTML5语音搜索的示例分析
      这篇文章将为大家详细讲解有关HTML5语音搜索的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 淘宝网的语音搜索也有了一阵子了,但似乎都没看到相关的博客或帖子在...
      99+
      2024-04-02
    • python模块中搜索路径和顺序的示例分析
      这篇文章主要介绍python模块中搜索路径和顺序的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗易懂...
      99+
      2023-06-14
    • Linux中搜索文件命令的示例分析
      小编给大家分享一下Linux中搜索文件命令的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!文件搜索命令locate:搜索快,新建文件无法搜索;命令格式: ...
      99+
      2023-06-09
    • Dreamweaver中正则表达式搜索的示例分析
      这篇文章主要为大家展示了“Dreamweaver中正则表达式搜索的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Dreamweaver中正则表达式搜索的示例分析”这篇文章吧。比如:&nb...
      99+
      2023-06-08
    • LeetCode中广度优先搜索算法的示例分析
      小编给大家分享一下LeetCode中广度优先搜索算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、认识广度优先搜索算法广度优先搜索(BFS)算法是图...
      99+
      2023-06-19
    • SQL Server全文搜索功能的示例分析
      这篇文章主要为大家展示了“SQL Server全文搜索功能的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL Server全文搜索功能的示例分析”这...
      99+
      2024-04-02
    • python中列表索引的示例分析
      这篇文章给大家分享的是有关python中列表索引的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式...
      99+
      2023-06-14
    • mysql中正则表达式搜索功能的示例分析
      这篇文章主要介绍mysql中正则表达式搜索功能的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:我们知道正则表达式是描述搜索模式的特殊字符串。 它是一个强大的工具,为...
      99+
      2024-04-02
    • jQuery EasyUI tree增加搜索功能的示例分析
      这篇文章给大家分享的是有关jQuery EasyUI tree增加搜索功能的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。扩展jQuery EasyUI tree搜索树节...
      99+
      2024-04-02
    • 互联网中百度搜索引擎原理的示例分析
      这篇文章将为大家详细讲解有关互联网中百度搜索引擎原理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、百度抓取原理百度搜索引擎在抓取我们网站的时候,必须要有一个渠道,当你网站刚上线的时候,新建了...
      99+
      2023-06-10
    • MongoDB中索引的示例分析
      这篇文章主要介绍MongoDB中索引的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、索引究竟是什么东西?大部分开发者接触索引,大概知道索引类似书的目录,你要找到想要的内容...
      99+
      2024-04-02
    • Java二叉搜索树增、插、删、创的示例分析
      小编给大家分享一下Java二叉搜索树增、插、删、创的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!①概念二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有...
      99+
      2023-06-29
    • node.js基于mongodb的搜索分页示例
      mongodb模糊查询并分页 1.建立数据库 代码如下: var mongoose = require('mongoose'); var shortid = require('shortid'); va...
      99+
      2022-06-04
      分页 示例 node
    • C++使用LeetCode实现二叉搜索树的示例分析
      这篇文章将为大家详细讲解有关C++使用LeetCode实现二叉搜索树的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Given an integer n, generate all st...
      99+
      2023-06-20
    • C++回溯算法深度优先搜索的示例分析
      小编给大家分享一下C++回溯算法深度优先搜索的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!扑克牌全排列假如有编号为1~ 3的3张扑克牌和编号为1~3的3个盒子,现在需要将3张牌分别放到3个盒子中去,且每个盒子只能...
      99+
      2023-06-29
    • C++二叉搜索树实例分析
      本篇内容介绍了“C++二叉搜索树实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!独一无二的二叉搜索树Given an integer&...
      99+
      2023-06-19
    • MySQL索引的示例分析
      这篇文章给大家分享的是有关MySQL索引的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言我们知道,索引的选择是优化器阶段的工作,但是优化器并不是万能的,它有可能选错所...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作