Python基本常用算法

时间:2023-03-09 00:01:46
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 执行效率高