zoukankan      html  css  js  c++  java
  • 《算法图解》1

     前三章是打基础的,后面介绍的是应用广泛的算法。书中代码均用Python 2.7编写

    一、算法简介

    算法是一组完成任务的指令

    书中介绍算法的流程:描述算法----示例代码------大O()讨论运行时间-----可以解决的问题

    要明白不同算法的 优缺点,还要知道采用不同的数据结构结果可能大不相同。所以,算法和数据结构是不分家的

    二分查找:

    二分查找算法:每次都可以减少一半的量,前提是列表必须有序

     对于二分查找,从中间开始。这样每次就可以减少一半的量,最多需要lgN步,O(logN)。与之相对应,简单逐个查找,则最多需要N步,O(N)。

    二分代码如下:

     1 def binary_search(list, item):
     2     low = 0
     3     high = len(list)-1
     4 
     5     while low <= high:
     6         mid = int((low + high)/2)
     7         guess = list[mid]
     8         if guess == item:
     9             return mid
    10         if guess > item:
    11             high = mid - 1
    12         else:
    13             low = mid + 1
    14     return None
    15 
    16 my_list = (1, 3, 4, 5, 7, 9, 22, 33)
    17 print (binary_search(my_list, 9))
    18 print (binary_search(my_list, 8))
    View Code

     大O表示法

    大O表示法如下,一定注意括号里面的n的意义O表示法让你能够比较操作数(或者运行时间),它指出了算法运行时间的增速。 

    大O表示法数说的 是最糟糕的情形。除最糟情况下的运行时间外,还应考虑平均情况的运行时间。

    几种常见的大O运行时间:

     

     二、选择排序

    主要内容 :

    • 讲解最基本的数据结构:数组和链表,区分不同之处;
    • 介绍选择排序。排序很重要,如二分查找,前提是有序列表。选择排序是快速排序的基石

    数组,链表操作的运行时间:

    数组中的元素是相连的,而链表中的元素则可存储在内存中的任何地方 

    选择排序

    遍历列表中的每个元素一次,每次找到最小或最大值,总时间为O(n2

    代码如下:

     1 def findSmallest(arr):
     2     smallest = arr[0]
     3     smallest_index = 0
     4     for i in range(1, len(arr)):
     5         if arr[i] < smallest:
     6             smallest = arr[i]
     7             smallest_index = i
     8     return smallest_index
     9 #现在可以使用这个函数来编写选择排序算法了。
    10 def selectionSort(arr):
    11     newArr = []
    12     for i in range(len(arr)):        #代表从0到len,不包括len
    13         smallest = findSmallest(arr)
    14         newArr.append(arr.pop(smallest))
    15     return newArr
    16 
    17 print (selectionSort([5, 3, 6, 2, 10, -11]))
    View Code

     

      三、递归

    “如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解。如何选择要看什么对你来说更重要。”

    递归,是函数调用自己

     基线条件与递归条件:递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。
    如下图:

     

     

     

     另外一种数据结构:栈,只有两种操作: 压入(插入)和弹出(删除并读取)

    由下面的代码注意体会函数调用会用到栈

    代码:

     1 def greet(name):
     2     print ("hello, " + name + "!")
     3     greet2(name)
     4     print ("getting ready to say bye...")
     5     bye()
     6 
     7 def greet2(name):
     8     print ("how are you, " + name + "?")
     9 def bye():
    10     print ("ok bye!")
    11 
    12 greet("Lin")

     

    结果:

    hello, Lin!
    how are you, Lin?
    getting ready to say bye...
    ok bye!

     

    使用栈,方便,但是要付出内存的代价。

     

     

     

     

  • 相关阅读:
    查看tls指纹
    并行流
    方法引入2
    方法引入
    Optional.ofNullable
    stream.filter
    stream.skip limit
    反射
    Optional orElseGet
    nginx 预压缩(gzip)
  • 原文地址:https://www.cnblogs.com/skylover/p/7157850.html
Copyright © 2011-2022 走看看