什么是算法

就是一个计算的过程,解决问题的方法

用到知识点

递归

调用自身

有结束条件

下次执行相应的复杂度要减少

时间复杂度排序(按效率排序)

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基本常用算法的更多相关文章

  1. 关于python机器学习常用算法的例子

    Home Installation Documentation  Examples     Previous An introduction ... This documentation is for ...

  2. Python之路,Day21 - 常用算法学习

    Python之路,Day21 - 常用算法学习   本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...

  3. Python实现常用排序算法

    Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...

  4. python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表

    目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...

  5. 第四百一十四节,python常用算法学习

    本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...

  6. Python常用算法

    本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...

  7. Python数据结构与算法设计总结篇

    1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...

  8. Python数据结构与算法--List和Dictionaries

    Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...

  9. python中常用的九种数据预处理方法分享

    Spyder   Ctrl + 4/5: 块注释/块反注释 本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(St ...

随机推荐

  1. $聊一聊"驼峰"和"下划线"——Python re.sub函数详细用法实例讲解

    日常写代码时候会遇到一些字符串替换的操作,比如把一大堆"驼峰"形式的字符串批量转换成下划线形式."驼峰"形式的变量命名风格在Java中很常见,而下划线形式的变量 ...

  2. Linux中LVM2原理

    一.LVM原理 [MD]:Multi Device 多设备 Mdadm是一个用户空间工具,是RAID的管理工具,与真正的RAID工作没有太大关系.真正的RAID集成在linux内核中 [DM]Devi ...

  3. Python3.x:获取代理ip以及使用

    Python3.x:获取代理ip以及使用 python爬虫浏览器伪装 #导入urllib.request模块 import urllib.request #设置请求头 headers=("U ...

  4. 20145313张雪纯 《Java程序设计》第1周学习总结

    20145313 <Java程序设计>第1周学习总结 教材学习内容总结 java有三大平台,分别为Java SE(J2SE).Java EE(J2EE).Java ME(J2 ME). J ...

  5. 20145314郑凯杰 《Java程序设计》第3周学习总结

    20145314郑凯杰 <Java程序设计>第3周学习总结 所有代码均已托管 地址https://git.oschina.net/qiaokeli26/codes 按照下面程序结果中的代码 ...

  6. P(Y|X) 和 P(X,Y)

    P ( x | y ):在Y发生的条件下,X发生的概率.P ( x , y )P(x,y)说明该事件与两个因素有关,比如设是因素A,B.P(x,y)=P{因素A处于x状态,因素B处于y状态}确切地说P ...

  7. 用python打印99乘法口诀表

    代码如下 #!/usr/bin/env python # encoding: utf-8 __author__ = 'Nicholas.Cage' i = 1 j = 1 while i <= ...

  8. JAVA启动参数整理[转]

    java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  9. svn根据项目来创建目录结构或者根据分支来创建项目结构

    假设检出项目的时候,都使用trunk来进行检出 按照项目来创建目录结构 TestPrj版本库 适合一次只检出一个项目的需求 这个版本库的名字无所谓,随便起就好了.因为检出某一个项目的trunk的时候, ...

  10. MySQL中表复制:create table like 与 create table as select

    1    CREATE TABLE A LIKE B此种方式在将表B复制到A时候会将表B完整的字段结构和索引复制到表A中来. 2.    CREATE TABLE A AS SELECT * FROM ...