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 ...
随机推荐
- 关于hashmap 与concurrentHashMap
hashmap是不安全的,要实现安全,可以用Collections里面的synchronizedMap包裹来实现安全,或者用concurrentMap, 注意:hashtable是安全的 从JDK1. ...
- 【c++ primer, 5e】参数传递
p187~p199: [传值参数] [传引用参数] 使用引用形参返回额外信息:传入一个(或者多个)额外的引用实参,令其保存字符出现的次数. 6.11 #include <iostream> ...
- C#图片增加水印
给图片增加水印 1.引用 using System.Drawing; 2.代码实现 string ImagePath = @"C:\Users\RAPOO\Pictures\Camera R ...
- Web前端学习笔记之jQuery基础
0x0 jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Aja ...
- 浅谈web应用的负载均衡、集群、高可用(HA)解决方案
http://aokunsang.iteye.com/blog/2053719 声明:以下仅为个人的一些总结和随写,如有不对之处,还请看到的网友指出,以免误导. (详细的配置方案请google,这 ...
- 源码安装GCC-4.9.2
本文参考:http://cuchadanfan.blog.51cto.com/9940284/1689556 感谢原作者的分享! 首先安装基础包,安装网络依赖的时候要用 [root@localhos ...
- RabbitMQ延迟队列
rabbitmq延迟队列 rabbitmq实现延迟队列用了rabbitmq-delayed-message-exchange插件,需要提前安装,并启用. 原理 其原理是通过Exchange来实现延迟功 ...
- LeetCode——merge-two-sorted-lists
Question Merge two sorted linked lists and return it as a new list. The new list should be made by s ...
- 商品详情页,banner滚动点击加载效果,js,jquary
<script language="javascript"> $(document).ready(function () { //purchase ...
- Flume NG初次使用
一.什么是Flume NG Flume是一个分布式.可靠.和高可用性的海量日志采集.聚合和传输的系统,支持在日志系统中定制各类数据发送方,用于收集数据:同时Flume提供对数据的简单处理,并写到各种数 ...