美文网首页
算法图解1-2/11

算法图解1-2/11

作者: 废柴社 | 来源:发表于2018-03-25 21:56 被阅读11次

    原书作者 Aditya Bhargava

    1 算法简介

    1.1 二分法查找

    二分法查找,正是猜数字游戏的玩法:A从1-100中随机挑一个数,B来猜,A返回B猜的数是大了还是小了,最快的一种方法就是二分法(猜50-->小了,接下来猜75……)

    二分法查找速度.png
    def binary_search(list, item):
      low = 0
      high = len(list)-1
      while low <= high:
        mid = int(round((low + high)/2))  #←---就检查中间的元素
        guess = list[mid]
        print(guess)
        if guess == item:  #←--------找到了元素
           return mid
        if guess > item:
            print('←-------------猜的数字大了')   
            high = mid - 1
        else:
            print('←--------------猜的数字小了')
            low = mid + 1
      return None  #←--------------------没有指定的元素
    
    #测试
    my_list = [1, 3, 5, 7, 9]  
    print(binary_search(my_list, 3))
    

    1.2 算法运行时间

    不同的算法,运行时间差异很大。

    简单查找与二分查找.png

    五种最常见的算法运行时间

    • O(logn),也叫对数时间,如二分查找。
    • O(n),也叫线性时间,如简单查找。
    • O(n * logn),如快速排序(后续笔记)
    • O(n^2),选择排序(后续笔记)——一种速度较慢的排序算法。
    • O(n!),如旅行商问题。
    image.png

    2 选择排序

    2.1 数组和链表

    数组就是一列相邻的数据,位置关系固定,查找(读取很快),要插入1个数据时,必需把后面的数据全部移动一位;但如果内存中的连续空位不够时就比较麻烦;
    链表中中每个元素会记录下一个元素的位置,所以插入很好操作——只需修改一个指向记录。删除操作类似的,也只需要更改某下一个元素的指向位置即可。

    • 计算机内存犹如一大堆抽屉。
    • 需要存储多个元素时,可使用数组或链表。
    • 数组的元素都在一起。
    • 链表的元素是分开的,链表中的元素可存储在内存的任何地方,其中每个元素都存储了下一个元素的地址。
    • 数组的读取速度很快。
    • 链表的插入和删除速度很快。
    image.png

    2.2 选择排序

    选择排序:遍历这个列表,找出播放次数最多的乐队,并将该乐队添加到一个新列表中。接下来继续该操作(找到第二多的乐队),最终得到一个有序列表。

    从大到小排序-选择排序

    每次操作需要针对剩余的n个元素(n,n-1,……1,平均为n1/2),共操作n次,故算法时间为O(nn*1/2),通常忽略常数项,得算法时间为O(n^2)

    相关文章

      网友评论

          本文标题:算法图解1-2/11

          本文链接:https://www.haomeiwen.com/subject/jfmkcftx.html