算法基础——列表查找

what's the 算法

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度时间复杂度来衡量。
算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。

 

时间复杂度

  时间复杂度用于评估算法运行效率。

  在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。通常写法为O(n)

举例说明:

print('Hello World')               #O(1)  只执行一次for i in range(n):    print('Hello World')           #O(n)   执行了n次for i in range(n):    for j in range(n):        print('Hello World')       #O(n**2)   执行了n*n次for i in range(n):    for j in range(n):        for k in range(n):            print('Hello World')   #O(n**3)   执行了n*n*n次while n > 1:    print(n)    n = n // 2
"""
n=64时输出:64
32
16
8
4
2   所以我们发现这个执行的次数是2的幂次方,O(log2 n)简写为O(logn)
"""

注意:时间复杂度没有O(3)、O(1/2n)、O(n^2+n)的说法,因为时间复杂度只是一个用于衡量的估算值,所以上述改写为O(1)、O(n)、O(n^2)即可

  一般来说,时间复杂度高的算法比时间复杂度低的算法效率要慢,常见的时间复杂度按效率排序为

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^2*logn) < O(n^3)

  当然还有一些不常用的时间复杂度——O(n!) O(2^n) O(n^n) …这些都不重要

 

空间复杂度 

  空间复杂度(Space Complexity)用来评估算法内存占用大小的一个式子。

  空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。

   一般小程序的情况下,我们通常会稍微牺牲点内存来加快效率,即我们会用空间换时间,所以我们会适当提高空间复杂度以减少时间复杂度。

 

列表查找

算法最基本的应用就是对列表的查找与排序,这里我们说一下列表查找。

列表查找就是针对一个列表中待查找的元素,输出该元素的索引值index,如果该列表中不含有目标值则输出None

列表查找的方式有两种——顺序查找二分查找

    • 顺序查找:从列表第一个元素开始,顺序进行搜索,直到找到为止。
    • 二分查找:从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

li=[1,2,3,4,5,6,7,8,9,10]#顺序查找
def linear_search(data_set, value):for i in data_set:if data_set[i] == value:return ireturnthe_index=linear_search(li,3)
print(the_index)#2     O(n)#二分查找
def bin_search(data_set, value):low = 0high = len(data_set) - 1while low <= high:mid = (low+high)//2if data_set[mid] == value:return midelif data_set[mid] > value:high = mid - 1else:low = mid + 1bin_index=bin_search(li,3)
print(bin_index)#2    O(logn)       可以发现二分查找比顺序查找要更快

二分法可使用递归完善:

def bin_search_rec(data_set,value,low,high):if low <= high:mid=(low+high) // 2if data_set[mid] == value:return midelif data_set[mid] > value:return bin_search_rec(data_set,value,low,mid-1)else:return bin_search_rec(data_set,value,mid+1,high)else:return Noneli=[1,2,3,4,5,6,7,8,9,10]
a=bin_search_rec(li,3,1,10)
print(a)#2
使用递归的二分法

 


 

列表查找小练习:

  现有一个学员信息列表(按id增序排列),格式为:

    [ {id:1001, name:"张三", age:20}, {id:1002, name:"李四", age:25}, {id:1004, name:"王五", age:23}, {id:1007, name:"赵六", age:33} ]

  修改二分查找代码,输入学生id,输出该学生在列表中的下标,并输出完整学生信息。

 

列表排序

列表排序即将无需列表变为有序,Python的内置函数为sort()。应用的场景主要有:各种榜单、各种表格、给二分查找用、 其他算法用等等。

有关列表排序的算法有很多,主要分为:

  • low B三人组: 冒泡排序、 选择排序、 插入排序
  • NB三人组: 快速排序、 堆排序、 归并排序

  • 其他排序算法: 基数排序、 希尔排序、 桶排序

有关列表排序算法博客链接地址:http://www.cnblogs.com/zhuminghui/p/8401129.html

 

 

 

                                    

 

转载于:https://www.cnblogs.com/zhuminghui/p/8400216.html

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

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

相关文章

Python画板画图之美

Python画板画图之美 *turtle.done() #可让画板窗口停止*1.绘制同切圆 pensize为画笔宽度 circle(n),n为半径大小&#xff0c;两者单位均为像素 import turtle turtle.pensize(2) #画笔宽度&#xff0c;单位为像素 turtle.circle(10) #圆半径&…

python request库_【Python爬虫】Request库入门

什么是爬虫&#xff1f; 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还…

world文档粘贴图片进去看不到

在大学做实验报告的时候经常要插入一些截图&#xff0c;往往会遇到直接复制粘贴图片会看不到的情况&#xff0c;会很烦&#xff0c;我自己也找了好多方法&#xff0c;下面是我最喜欢的简便方法的一种。 解决方法如下: 可以点击鼠标右键选择段落&#xff0c;将行距修改为1.5倍即…

c盘users的用户名怎么改_怎么修改iPhone备份文件夹路径 iPhone C盘路径修改教程【详解】...

iPhone备份文件夹路径怎么修改_iPhone C盘备份路径修改教程 我们都知道iPhone默认的备份是在C盘&#xff0c;不过现在各种视频、照片体积那么大&#xff0c;小小的C盘只怕是负荷不了了&#xff0c;那么有什么办法去修改备份路径呢&#xff0c;下面小编就为大家介绍一下。需要注…

javaweb开发的准备工作——配置篇

1.配置 a. jdk配置&#xff08;用于web开发编程&#xff0c;此处不需要配置path&#xff0c;只需配置环境变量即可&#xff09; b. tomcat配置 打开Tomcat&#xff08;打开bin目录下的startup.bat文件&#xff09; 检验是否打开成功(两个网址都可以&#xff0c;出现汤姆猫即为…

阅读引擎开源项目调研总结

农历腊月初二&#xff0c;也是冬至后的第四个九天&#xff0c;俗称“四九”。冬至这一天开始数九&#xff0c;这就是人们所说的“提冬数九”。数上9天是一九&#xff0c;再数9天是二九……数到“九九”就算“九”尽了&#xff0c;“九尽杨花开”&#xff0c;那时天就暖了。《九…

ftp 上传文件夹_命令行连接FTP服务器

Windows下&#xff1a;打开命令行窗口&#xff0c;输入 ftp&#xff0c;进入ftp命令模式&#xff1a;输入 open ip地址 端口&#xff0c;进入ftp服务器&#xff0c;如open 172.16.3.77 2121。如下图&#xff1a;输入Windows下的用户名&#xff0c;然后输入密码&#xff08;注意…

创建实现一个简单的web项目

创建一个新的web项目 注意要选择Dynamic Web Project&#xff0c;第一次用可能要找一下&#xff0c;也可以直接搜索栏搜web&#xff0c;就会出来 图片是我自己照片照的&#xff0c;不好截图&#xff0c;看到有个人影勿慌哈哈哈哈&#xff0c;不是你眼睛的问题。 然后在web文件目…

eclipse xml文件报错_Maven教程6: Maven与Eclipse整合

点击上方“Java技术前线”&#xff0c;选择“置顶或者星标”与你一起成长一、安装Maven插件下载下来的maven插件如下图所示&#xff1a;&#xff0c;插件存放的路径是&#xff1a;E:/MavenProject/Maven2EclipsePlugin进入到eclipse中的dropins目录下&#xff0c;新建三个txt文…

C语言#define宏定义可能注意不到的地方

#define使用的核心:直接替换 我也觉得自己很清楚这一点&#xff0c;但看到这一道输出程序片段结果题&#xff0c;还是懵了。大家也可以在不看我下方答案的情况下&#xff0c;自己做一下&#xff0c;题目如下: #include<stdio.h> #define P 3 #define S(a) P*a*a int mai…

结合JSP与HTML做一个九九乘法表

不说了&#xff0c;先上效果图&#xff0c;下面附有源码: 代码一:jsp表达式法 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitio…

python中parse是什么_Python中optparse模块使用浅析

最近遇到一个问题&#xff0c;是指定参数来运行某个特定的进程&#xff0c;这很类似Linux中一些命令的参数了&#xff0c;比如ls -a&#xff0c;为什么加上-a选项会响应。optparse模块实现的也是类似的功能&#xff0c;它是为脚本传递命令参数。 使用此模块前&#xff0c;首先需…

Topshelf创建Windows服务

入门例子 using log4net; using System; using System.Timers; using Topshelf;namespace ConsoleAppTest {class Program{static void Main(string[] args){log4net.Config.XmlConfigurator.Configure();HostFactory.Run(x >{x.Service<TownCrier>();x.RunAsLocalSys…

jsp网页中的换行

JSP网页中输出换行在一开始学习的时候困扰了我不短的时间&#xff0c;因为一些排版需要换行总是很难实现&#xff0c;随着学习&#xff0c;找到了如下几种方法做到换行&#xff0c;以保持页面的美观。 代码和截图我给放在下面了&#xff0c;附了注释: 代码如下&#xff0c;想…

npu算力如何计算_CPU、GPU、NPU、FPGA等芯片架构特点分析

来源 | 汽车电子与软件知圈 | 进“高精度地图社群”&#xff0c;请加微信15221054164&#xff0c;备注地图概述随着人工智能的热潮和AI算法的广泛应用&#xff0c;深度学习已成为当前AI研究的重点&#xff0c;在自动驾驶领域&#xff0c;环境感知、传感器融合、控制决策等等都会…

Eclipse——恢复的默认窗口设置篇

你可能也会像我一样&#xff0c;时不时不小心把一些窗口关掉了&#xff0c;然后想要改回来的时候&#xff0c;又要疯狂的去设置里把它们一个个的显示出来&#xff0c;大概率的还可能得百度一下&#xff0c;看着英文单词有时候就会烦躁。 直接崩溃&#xff1a; 这里一招教你直…

翻牌游戏如何打乱牌面java_家长专栏提高儿童记忆力的游戏训练

记忆是人脑对过去经验的保持和再现。记忆过程包括三个基本环节&#xff0c;即识记、保持、再认或回忆。识记是识别和记住事物。保持是将已获得的知识或经验巩固与保留在大脑中。再认是指过去经历过的事物再度出现时&#xff0c;能将它指认出来。回忆是指过去经历过的事物不在面…

Leetcode 206. Reverse Linked List

Similar Questions Reverse Linked List II Binary Tree Upside Down Palindrome Linked List思路&#xff1a;链表反转。 解法一&#xff1a;迭代。 添加头节点&#xff08;推荐&#xff09;&#xff1a;不断将当前元素start插入dummy和dummy.next之间&#xff0c;实现反转。…

java中输出系统时间

老用老忘&#xff0c;乐此不疲 自己给自己写个模板&#xff0c;忘了随时copy也很香&#xff0c;不是吗&#xff1f; 不说废话了&#xff0c;上代码: package java操作的复习;import java.text.SimpleDateFormat; import java.util.Date;public class SystemTime {public sta…

centos redis make 报错_Redis入门安装,你只需要看我写的这篇就行了

今天来写点基础的东西&#xff0c;可能很多初学者不太会装Redis&#xff0c;这篇文章主要是分享一下如何在Linux中安装redis服务。1. Redis的介绍Redis是一种非关系型数据库(NoSQL)&#xff0c;NoSQL是以key-value的形式存储&#xff0c;和传统的关系型数据库不一样&#xff0c…