什么是算法

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

用到知识点

递归

调用自身

有结束条件

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

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

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)

判断时间复杂度

1.循环减半的过程就是O(logn)

2.几次循环就是n的几次方的复杂度

空间复杂度(以空间换时间)

评估算法内存占用大小

列表查找

顺序查找

从列表第一个元素开始,顺序进行搜索,直到找到为止。

  1. def linear_seach(data_set,val):
  2. for i in range(,data_set):
  3. if i == val:
  4. print(i)
  5. return i
  6. return '没找到'

二分查找

有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

  1. def bin_seacher(data_set,val):
  2. low =
  3. high = len(data_set) -
  4. while low <= high:
  5. mid = (low+high) //
  6. if data_set[mid] == val:
  7. print('索引位置:',mid)
  8. return mid
  9. elif data_set[mid] < val:
  10. low = mid +
  11. else:
  12. high = mid -
  13. print('没有找到')
  14. return None
  15.  
  16. li = range()
  17. bin_seacher(li,)

案例

  1. import random
  2.  
  3. def random_list(n):
  4. '''
  5. 生成随机数据
  6. :param n:
  7. :return:
  8. '''
  9. ret = []
  10. a1 = ['赵','钱','孙','李','邹','吴','郑','王','周']
  11. a2 = ['力','好','礼','丽','文','建','梅','美','高','']
  12. a3 = ['强','文','斌','阔','文','莹','超','云','龙','']
  13. ids = range(,+n)
  14. for i in range(n):
  15. name = random.choice(a1) + random.choice(a2) +random.choice(a3)
  16. age = random.randint(,)
  17. dic = {'id':ids[i], 'name':name, 'age':age}
  18. ret.append(dic)
  19. return ret
  20.  
  21. def id_seacher(data_list,id):
  22. low =
  23. high = len(data_list) -
  24. while low <= high:
  25. mid = (low+high) //
  26. if data_list[mid]['id'] == id:
  27. print('索引位置:',mid)
  28. return mid
  29. elif data_list[mid]['id'] < id:
  30. low = mid +
  31. else:
  32. high = mid -
  33. print('没有找到')
  34. return None
  35.  
  36. data_list = random_list()
  37. ind = id_seacher(data_list,)
  38. print(data_list[ind]['name'])#输入人名

冒泡排序

首先,列表每两个相邻的数,如果前边的比后边的大,那么交换这两个数

循环无序区的数继续比较

  1. import random
  2. def bubble_sort(li):
  3.  
  4. for i in range(len(li) - ):# 几趟
  5. exchange = False # 标志位
  6. for j in range(len(li) - i - ):
  7. if li[j] > li[j + ]:
  8. li[j], li[j + ] = li[j + ], li[j]
  9. exchange = True
  10. if not exchange:
  11. break
  12. li = list(range())
  13. random.shuffle(li)
  14. print(li)
  15. bubble_sort(li)
  16. print(li)

时间复杂 

最好情况 O(n)

一般情况 O (n2)

最差情况 O (n2)

选择排序 

  一趟遍历记录最小的数,放到第一个位置;

再一趟遍历记录剩余列表中最小的数,继续放置;

  1. def select_sort(li):
  2.  
  3. for i in range(len(li) - ): #循环次数
  4. min_loc = i
  5. for j in range(i + ,len(li)):#从无序区找
  6. if li[j] < li[min_loc]:
  7. min_loc = j
  8. li[i], li[min_loc] = li[min_loc], li[i]
  9.  
  10. li = list(range())
  11. random.shuffle(li)
  12. print(li)
  13. select_sort(li)
  14. print(li)

插入排序  

  列表被分为有序区和无序区两个部分。最初有序区只有一个元素。

  每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。

  1. def insert_sort(li):
  2. for i in range(,len(li)):
  3. tmp = li[i]
  4. j = i -
  5. while j >= and tmp < li[j]:
  6. # 判断新数是否比前一个数小,小就将前一个数向后挪一个位置
  7. li[j + ] = li[j]
  8. j -=
  9. li[j + ] = tmp
  10.  
  11. li = list(range())
  12. random.shuffle(li)
  13. print(li)
  14. insert_sort(li)
  15. print(li)

a. 时间效率

  1. # coding:utf-
  2.  
  3. from timeit import Timer
  4.  
  5. # li1 = [, ]
  6. #
  7. # li2 = [,]
  8. #
  9. # li = li1+li2
  10. #
  11. # li = [i for i in range()]
  12. #
  13. # li = list(range())
  14.  
  15. def t1():
  16. li = []
  17. for i in range():
  18. li.append(i)
  19.  
  20. def t2():
  21. li = []
  22. for i in range():
  23. li += [i]
  24.  
  25. def t3():
  26. li = [i for i in range()]
  27.  
  28. def t4():
  29. li = list(range())
  30.  
  31. def t5():
  32. li = []
  33. for i in range():
  34. li.extend([i])
  35.  
  36. timer1 = Timer("t1()", "from __main__ import t1")
  37. print("append:", timer1.timeit())
  38.  
  39. timer2 = Timer("t2()", "from __main__ import t2")
  40. print("+:", timer2.timeit())
  41.  
  42. timer3 = Timer("t3()", "from __main__ import t3")
  43. print("[i for i in range]:", timer3.timeit())
  44.  
  45. timer4 = Timer("t4()", "from __main__ import t4")
  46. print("list(range()):", timer4.timeit())
  47.  
  48. timer5 = Timer("t5()", "from __main__ import t5")
  49. print("extend:", timer5.timeit())
  50.  
  51. def t6():
  52. li = []
  53. for i in range():
  54. li.append(i)
  55.  
  56. def t7():
  57. li = []
  58. for i in range():
  59. li.insert(, i)
  60.  
  61. #------------------结果-------
  62. append: 1.0916136799496599
  63. +: 1.0893132810015231
  64. [i for i in range]: 0.4821193260140717
  65. list(range()): 0.2702883669990115
  66. extend: 1.576017125044018

Python列表类型不同分别操作的时间效率

  1. def t6():
  2. li = []
  3. for i in range():
  4. li.append(i)
  5.  
  6. def t7():
  7. li = []
  8. for i in range():
  9. li.insert(, i)
  10.  
  11. timer6 = Timer("t6()", "from __main__ import t6")
  12. print("append", timer6.timeit())
  13.  
  14. timer7 = Timer("t7()", "from __main__ import t7")
  15. print("insert(0)", timer7.timeit())
  16.  
  17. ####################
  18. append 1.1599015080137178
  19. 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. 关于hashmap 与concurrentHashMap

    hashmap是不安全的,要实现安全,可以用Collections里面的synchronizedMap包裹来实现安全,或者用concurrentMap, 注意:hashtable是安全的 从JDK1. ...

  2. 【c++ primer, 5e】参数传递

    p187~p199: [传值参数] [传引用参数] 使用引用形参返回额外信息:传入一个(或者多个)额外的引用实参,令其保存字符出现的次数. 6.11 #include <iostream> ...

  3. C#图片增加水印

    给图片增加水印 1.引用 using System.Drawing; 2.代码实现 string ImagePath = @"C:\Users\RAPOO\Pictures\Camera R ...

  4. Web前端学习笔记之jQuery基础

    0x0 jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Aja ...

  5. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案

    http://aokunsang.iteye.com/blog/2053719   声明:以下仅为个人的一些总结和随写,如有不对之处,还请看到的网友指出,以免误导. (详细的配置方案请google,这 ...

  6. 源码安装GCC-4.9.2

    本文参考:http://cuchadanfan.blog.51cto.com/9940284/1689556  感谢原作者的分享! 首先安装基础包,安装网络依赖的时候要用 [root@localhos ...

  7. RabbitMQ延迟队列

    rabbitmq延迟队列 rabbitmq实现延迟队列用了rabbitmq-delayed-message-exchange插件,需要提前安装,并启用. 原理 其原理是通过Exchange来实现延迟功 ...

  8. 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 ...

  9. 商品详情页,banner滚动点击加载效果,js,jquary

    <script language="javascript">       $(document).ready(function () {   //purchase   ...

  10. Flume NG初次使用

    一.什么是Flume NG Flume是一个分布式.可靠.和高可用性的海量日志采集.聚合和传输的系统,支持在日志系统中定制各类数据发送方,用于收集数据:同时Flume提供对数据的简单处理,并写到各种数 ...