Python基本常用算法
什么是算法
就是一个计算的过程,解决问题的方法
用到知识点
递归
调用自身
有结束条件
下次执行相应的复杂度要减少
时间复杂度排序(按效率排序)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)
判断时间复杂度
1.循环减半的过程就是O(logn)
2.几次循环就是n的几次方的复杂度
空间复杂度(以空间换时间)
评估算法内存占用大小
列表查找
顺序查找
从列表第一个元素开始,顺序进行搜索,直到找到为止。
def linear_seach(data_set,val):
for i in range(,data_set):
if i == val:
print(i)
return i
return '没找到'
二分查找
从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。
def bin_seacher(data_set,val):
low =
high = len(data_set) -
while low <= high:
mid = (low+high) //
if data_set[mid] == val:
print('索引位置:',mid)
return mid
elif data_set[mid] < val:
low = mid +
else:
high = mid -
print('没有找到')
return None li = range()
bin_seacher(li,)
案例
import random def random_list(n):
'''
生成随机数据
:param n:
:return:
'''
ret = []
a1 = ['赵','钱','孙','李','邹','吴','郑','王','周']
a2 = ['力','好','礼','丽','文','建','梅','美','高','']
a3 = ['强','文','斌','阔','文','莹','超','云','龙','']
ids = range(,+n)
for i in range(n):
name = random.choice(a1) + random.choice(a2) +random.choice(a3)
age = random.randint(,)
dic = {'id':ids[i], 'name':name, 'age':age}
ret.append(dic)
return ret def id_seacher(data_list,id):
low =
high = len(data_list) -
while low <= high:
mid = (low+high) //
if data_list[mid]['id'] == id:
print('索引位置:',mid)
return mid
elif data_list[mid]['id'] < id:
low = mid +
else:
high = mid -
print('没有找到')
return None data_list = random_list()
ind = id_seacher(data_list,)
print(data_list[ind]['name'])#输入人名
冒泡排序
首先,列表每两个相邻的数,如果前边的比后边的大,那么交换这两个数
循环无序区的数继续比较
import random
def bubble_sort(li): for i in range(len(li) - ):# 几趟
exchange = False # 标志位
for j in range(len(li) - i - ):
if li[j] > li[j + ]:
li[j], li[j + ] = li[j + ], li[j]
exchange = True
if not exchange:
break
li = list(range())
random.shuffle(li)
print(li)
bubble_sort(li)
print(li)
时间复杂
最好情况 O(n)
一般情况 O (n2)
最差情况 O (n2)
选择排序
一趟遍历记录最小的数,放到第一个位置;
再一趟遍历记录剩余列表中最小的数,继续放置;
def select_sort(li):
for i in range(len(li) - ): #循环次数
min_loc = i
for j in range(i + ,len(li)):#从无序区找
if li[j] < li[min_loc]:
min_loc = j
li[i], li[min_loc] = li[min_loc], li[i]
li = list(range())
random.shuffle(li)
print(li)
select_sort(li)
print(li)
插入排序
列表被分为有序区和无序区两个部分。最初有序区只有一个元素。
每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。
def insert_sort(li):
for i in range(,len(li)):
tmp = li[i]
j = i -
while j >= and tmp < li[j]:
# 判断新数是否比前一个数小,小就将前一个数向后挪一个位置
li[j + ] = li[j]
j -=
li[j + ] = tmp li = list(range())
random.shuffle(li)
print(li)
insert_sort(li)
print(li)
a. 时间效率
# coding:utf- from timeit import Timer # li1 = [, ]
#
# li2 = [,]
#
# li = li1+li2
#
# li = [i for i in range()]
#
# li = list(range()) def t1():
li = []
for i in range():
li.append(i) def t2():
li = []
for i in range():
li += [i] def t3():
li = [i for i in range()] def t4():
li = list(range()) def t5():
li = []
for i in range():
li.extend([i]) timer1 = Timer("t1()", "from __main__ import t1")
print("append:", timer1.timeit()) timer2 = Timer("t2()", "from __main__ import t2")
print("+:", timer2.timeit()) timer3 = Timer("t3()", "from __main__ import t3")
print("[i for i in range]:", timer3.timeit()) timer4 = Timer("t4()", "from __main__ import t4")
print("list(range()):", timer4.timeit()) timer5 = Timer("t5()", "from __main__ import t5")
print("extend:", timer5.timeit()) def t6():
li = []
for i in range():
li.append(i) def t7():
li = []
for i in range():
li.insert(, i) #------------------结果-------
append: 1.0916136799496599
+: 1.0893132810015231
[i for i in range]: 0.4821193260140717
list(range()): 0.2702883669990115
extend: 1.576017125044018
Python列表类型不同分别操作的时间效率
def t6():
li = []
for i in range():
li.append(i) def t7():
li = []
for i in range():
li.insert(, i) timer6 = Timer("t6()", "from __main__ import t6")
print("append", timer6.timeit()) timer7 = Timer("t7()", "from __main__ import t7")
print("insert(0)", timer7.timeit()) ####################
append 1.1599015080137178
insert() 23.26370093098376
append 比 insert 执行效率高
Python基本常用算法的更多相关文章
- 关于python机器学习常用算法的例子
Home Installation Documentation Examples Previous An introduction ... This documentation is for ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- Python实现常用排序算法
Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...
- python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表
目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...
- 第四百一十四节,python常用算法学习
本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...
- Python常用算法
本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...
- Python数据结构与算法设计总结篇
1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...
- Python数据结构与算法--List和Dictionaries
Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...
- python中常用的九种数据预处理方法分享
Spyder Ctrl + 4/5: 块注释/块反注释 本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(St ...
随机推荐
- 关于URL和http协议,http消息格式
转自:http://crystal2012.iteye.com/blog/1447845 在WWW(全球资讯网)中想要连结到某个网页,便需要给浏览器一个位址,而URL在此的功能就是告知浏览器某个资源在 ...
- AVAudioSession(3):定制 Audio Session 的 Category
本文转自:AVAudioSession(3):定制 Audio Session 的 Category | www.samirchen.com 本文内容主要来源于 Working with Catego ...
- 同时执行2条不同sql
select * from a: select *from b; 用分号结束.
- 编码解码--三种常见字符编码简介:ASCII、Unicode和UTF-8
什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...
- ThinkPHP5显示数据库字段内容
1.在application文件夹下面的config.php中打开DEBUG. 2.修改tp5/application/index/controller/Index.php内容. <?php n ...
- MySQL中变量的用法——LeetCode 178. Rank Scores
Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ra ...
- 什么时候使用namespace
#include<iostream.h> 不用using namespace std; #include<iostream>要用using namespace std;
- MySQL——修改数据表
1.添加单列: ALERT TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name 其中tbl_nam ...
- IE兼容性视图,新增元素导致白页面
环境: 浏览器:IE8/9浏览器[兼容性视图] doctype:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transit ...
- swift学习笔记 - swift3.0用GCD实现计时器
swift3.0之后,GCD的语法发生了翻天覆地的变化,从过去的c语法变成了点语法,下面是变化之后用GCD实现计时器的方法: 先贴代码: // 定义需要计时的时间 var timeCount = 60 ...