python数据算法有哪些_python算法与数据结构-常用查找算法一(37)

一、什么是查找

查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

查找表(Search Table):由同一类型的数据元素(或记录)构成的集合

关键字(Key):数据元素中某个数据项的值,又称为键值。

主键(Primary Key):可唯一地标识某个数据元素或记录的关键字。

搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找。

二、无序表查找

也就是数据不排序的线性查找,遍历数据元素。

算法分析:最好情况是在第一个位置就找到了,此为O(1);最坏情况在最后一个位置才找到,此为O(n);所以平均查找次数为(n+1)/2。最终时间复杂度为O(n)

#最基础的遍历无序列表的查找算法#时间复杂度O(n)

defsequential_search(lis, key):

length=len(lis)for i inrange(length):if lis[i] ==key:returnielse:returnFalseif __name__ == '__main__':

LIST= [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]

result= sequential_search(LIST, 123)print(result)

三、二分查找(Binary Search)

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

算法核心:在查找表中不断取中间元素与查找值进行比较,以二分之一的倍率进行表范围的缩小。

1、二分查找的python代码实现

defbinary_search(lis, key):

low=0

high= len(lis) - 1time=0while low

time+= 1mid= int((low + high) / 2)if key

high= mid - 1

elif key >lis[mid]:

low= mid + 1

else:#打印折半的次数

print("times: %s" %time)returnmidprint("times: %s" %time)returnFalseif __name__ == '__main__':

LIST= [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]

result= binary_search(LIST, 1)print(result)

运行结果为:

查找次数为: 3下表为:0

2、二分查找的C语言代码实现

//main.m//二分查找//Created by 侯垒 on 2019/7/1.//Copyright © 2019 可爱的侯老师. All rights reserved.

# include

int binary_search(int array[],int key,intlen)

{int low = 0;int high = len-1;int time = 0;while (low

{

time++;int mid = (int)(low+high)/2;if (key

{

high= mid-1;

}else if(key>array[mid])

{

low= mid+1;

}else{//打印这本的次数

printf("查询次数 = %d\n",time);returnmid;

}

}

printf("查询次数 = %d\n",time);return -1;

}int main(int argc, const char *argv[])

{int array[11] = {1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444};int index = binary_search(array, 1, 11);

printf("下标是 = %d\n",index);return 0;

}

运行结果为:

查询次数 = 3下标是= 0

四、插值查找

在介绍插值查找之前,首先考虑一个新问题,为什么上述算法一定要是折半,而不是折四分之一或者折更多呢?

打个比方,在英文字典里面查“apple”,你下意识翻开字典是翻前面的书页还是后面的书页呢?如果再让你查“zoo”,你又怎么查?很显然,这里你绝对不会是从中间开始查起,而是有一定目的的往前或往后翻。

同样的,比如要在取值范围1 ~ 10000 之间 100 个元素从小到大均匀分布的数组中查找5, 我们自然会考虑从数组下标较小的开始查找。

经过以上分析,折半查找这种查找方式,不是自适应的(也就是说是傻瓜式的)。二分查找中查找点计算如下:

mid=(low+high)/2, 即mid=low+1/2*(high-low);

通过类比,我们可以将查找的点改进为如下:

mid=low+(key-list[low])/(list[high]-list[low])*(high-low),

也就是将上述的比例参数1/2改进为自适应的,根据关键字在整个有序表中所处的位置,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次数。

基本思想:基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找。

注:对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好的多。反之,数组中如果分布非常不均匀,那么插值查找未必是很合适的选择。

复杂度分析:查找成功或者失败的时间复杂度均为O(log(n))。

1、插值查找的python代码实现

defchazhi_search(lis, key):

low=0

high= len(lis) - 1time=0while low

time+= 1

#计算mid值是插值算法的核心代码

mid = low + int((key - lis[low])/(lis[high] - lis[low]) * (high -low))print("mid=%s, low=%s, high=%s" %(mid, low, high))if key

high= mid - 1

elif key >lis[mid]:

low= mid + 1

else:#打印查找的次数

print("查询次数: %s" %time)returnmidprint("times: %s" %time)returnFalseif __name__ == '__main__':

LIST= [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]

index= chazhi_search(LIST, 1)print("下标为:%s"%index)

运行结果为:

mid=0, low=0, high=10查询次数:1下标为:0

2、插值查找的C语言代码实现

//main.m//插值查找//Created by 侯垒 on 2019/7/1.//Copyright © 2019 可爱的侯老师. All rights reserved.

#include

int chazhi_search(int array[],int key,intlen)

{int low = 0;int high = len-1;int time = 0;while (low

{

time++;//计算mid值是插值算法的核心代码

int mid = low + (int)((key - array[low])/(array[high]-array[low])*(high-low));

printf("mid=%d, low=%d, high=%d\n",mid, low, high);if (key

{

high= mid-1;

}else if (key>array[mid])

{

low= mid+1;

}else{//打印查找的次数

printf("查询次数:%d\n",time);returnmid;

}

}

printf("查询次数:%d\n",time);return -1;

}int main(int argc, const char *argv[]) {int arr[] = {1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444};int index = chazhi_search(arr, 1, 11);

printf("下标为:%d\n",index);return 0;

}

运行结果为:

mid=0, low=0, high=10查询次数:1下标为:0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

circlegan_【源码解读】cycleGAN(二) :训练

训练的代码见于train.py,首先定义好网络,两个生成器A2B, B2A和两个判别器A, B,以及对应的优化器(优化器的设置保证了只更新生成器或判别器,不会互相影响)###### Definition of variables #######NetworksnetG_A2B Generator(opt.i…

电脑重启bootmgr_电脑出现bootmgr is missing怎么办

展开全部电脑开机,或者重启以后显示:Bootmgr is missing, 是代表硬盘的主引导记录(MBR)出错,从而导致无法引e68a8462616964757a686964616f31333337613931导系统,哪只能重建主引导记录,还有一个可能是丢失系统文件&…

python tkinter text改变文本字体颜色_如何更改Tkinter中文本的颜色?

在Tkinter图形用户界面中,我无法确定如何更改文本的颜色。我试着让Label1变成红色,Label2变成蓝色,Label3变成棕色,Label4变成黄色,但我似乎想不出来。提前谢谢:)import randomfrom Tkinter import * #dont…

qt 在label上以光标位置进行缩放_缩放|位移|渐变简单动画

本文简单介绍Qt的一些动画效果(缩放,位移,渐变)。缩放动画将窗口的geometry(位置,大小)属性作为动画参考实现缩放动画。代码QWidget *w new QWidget;w->setWindowTitle(QStringLiteral("缩放动画Qt君"));w->resize(320, 240)…

虚拟机中ubuntu可以使用显卡吗_在KVM下使用ubuntu19.10安装Anbox

导言:Anbox是一个Android模拟器,可以从linux系统运行Android应用程序或游戏。对于Anbox的安装已经有了各种教程,主要针对ubuntu18.04之前的版本。最近在做一个关于虚拟机中跑安卓的项目,因此在虚拟机中使用ubuntu18.04系统&#x…

mysql tree_MySQL树形遍历(二)

转载自:http://blog.csdn.net/dreamer0924/article/details/7580278英文原文:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/预排序遍历树算法:modified preorder tree traversal algorithm这个算法有如下几个数据结构1 lft 代表左 left2 r…

python导入pillow模块_Python:argparse模块和pillow-image

刚入门学python,最近照着实验楼做了一个基础的练手项目:图像转字符画,里面用到了argparse和pillow-image。看了python关于这个函数的介绍和网上的一些教程,想把重点整理出来,正好最近发现前一天还挺明白的内容&#xf…

mysql 常用数据库连接池_常见的数据库连接池

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 2.C3P0 在Hibernate和Spring中默认支持该数据库连接池 需要引入:c3p0-0.9.1.2.jar包,如果报错再引入mchange-commons-0.2.jar 1. 在类路径下编写一个c3p0-config.xml文件 c3p0-co…

win32_bios 的对象编辑器无法保存对象_怎样创建Femap对象

创建Femap对象主要有两种方式,一是直接在Femap内置的API程序窗体中创建,二是在API程序窗口以外的开发环境中创建。一、使用FEMAP集成的API程序窗口开始使用FEMAP API的最快方法是打开API编程窗口。它提供了一个完整的编辑、调试和运行的环境,…

nginx 在阿里云怎么安装mysql_阿里云Linux服务器安装 nginx+mysql+php

阿里云Linux服务器安装 nginxmysqlphp步骤1、登录服务器2、下载安装包3、将安装包上传到服务器的/home目录下注:使用rz sz命令进行本地和服务器间的上传、下载,安装命令yum install -y lrzsz4、解压安装包注:使用yum install unzip -y安装解压工具,安装完…

未定义变量: data_三、变量声明

三、变量声明var声明主要特点: - var是函数作用域,只针对函数声明 - 可以多次声明同一个变量不会报错 - 捕获变量怪异之处function fnVar(flag: boolean) {if(flag) {var x 10;}return x; } fnVar(true); // 10 fnVar(false); // undefinedvar isDone: …

阿帕奇链接mysql_apache guacamole 使用mysql 连接

1.创建一个临时文件夹,用来存放mysql-java连接器mkdir tempauth2.下载相关文件cd tempauthwget https://jaist.dl.sourceforge.net/project/guacamole/current/extensions/guacamole-auth-jdbc-0.9.14.tar.gzwget https://cdn.mysql.com//Downloads/Connector-J/mys…

表单的默认提交方式_对于PHP表单提交有哪集中方式讲解

PHP 做网页后端还是很优秀的&#xff0c;PHP 表单提交&#xff0c;不外乎两种方法&#xff0c;即 GET 和 POST 方法&#xff1b;PHP后台使用全局变量$_POST;$_GET;来获取提交数据。代码&#xff1a;<!DOCTYPE HTML> <html> <head><meta charset"utf-…

spring中怎么让事物提交_Spring怎么在一个事务中开启另一个事务

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;Mazinmy.oschina.net/u/3441184/blog/893628Spring项目&#xff0c;需要在一个事务中开启另一个事务。上面提到的情景可能不常见&#xff0c;但是还是会有的&#xff0c;一…

通过对象指针的方式强行指定到子类_C++中的虚指针与虚函数表

​ 最近在逛B站的时候发现有候捷老师的课程&#xff0c;如获至宝。因此&#xff0c;跟随他的讲解又复习了一遍关于C的内容&#xff0c;收获也非常的大&#xff0c;对于某些模糊的概念及遗忘的内容又有了更深的认识。以下内容是关于虚函数表、虚函数指针&#xff0c;而C中的动态…

datax oracle mysql_从 MySQL 到 Lindorm时序引擎 的数据迁移

背景本文主要介绍如何使用阿里巴巴的开源工具Datax 实现从 MySQL 到 时序引擎 的数据迁移。DataX相关使用介绍请参阅 DataX 的下面将首先介绍 DataX 工具本身&#xff0c;以及本次迁移工作涉及到的两个插件(MySQL Reader 和 TSDB Writer)。DataXDataX 是阿里巴巴集团内被广泛使…

如何手动输入给数组赋值_你是否真的了解VBA数组呢?让我带你认识一下真正的数组...

大家好&#xff0c;我们今日继续讲解VBA代码解决方案的第110讲内容&#xff1a;VBA数组讲解&#xff0c;什么是数组&#xff0c;如何定义数组&#xff0c;如何创建数组一、什么是数组 就是数组共享一个名字&#xff0c;有着多个元素按顺序排列的变量。在数组中&#xff0c;元素…

redhat9安装mysql_redhat 9.0 安装mysql

在官网上下载了MySQL-5.5.9-1.rhel5.i386.tar包 &#xff0c;将文件以二进制的形式ftp到虚拟机rehat上解压文件到MySQY-5文件夹下&#xff1a;然后将路径切换到解压目录下运行 rpm -ivh *.rpm --force报如下错&#xff1a;rootlocalhost MySQL-5]# rpm -ivh *.rpm --forceerror…

为什么整数在python中表示d_python中整数的缓存机制

在python中&#xff0c;如下代码结果一定不会让你吃惊&#xff1a;Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] on win32Type "copyright", "credits" or "license()" for more information.>&g…

MySQL中序列的作用_MySql中序列的应用和总结

Mysql中的序列主要用于主键&#xff0c;主键是递增的字段&#xff0c;不可重复。Mysql与Oracle不同的是&#xff0c;它不支持原生态的sequence&#xff0c;需要用表和函数的组合来实现类似序列的功能。1.首先创建序列的主表/*Navicat Premium Data TransferSource Server : MyS…