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


    1. 二分法:一组n个数字(有序排列)找到一个准确的数字,用二分法最多只要找log2n次。

    def binary_search(list, item):
                low = 0
                high = len(list) - 1
                while low <= high:
                    mid = round((low + high) / 2)
                    guess = list[:mid]
                    if guess == mid:
                    return mid
                    if mid > item:
                        high = mid-1
                        continue
                    else:
                        low = mid + 1
                        continue
                return None
            my_list = [1,3,6,9,12,16,17,21,29,32]
            print(binary_search(my_list, 3))


    2. 选择排序:
    在内存中,数组空间不够时,内存必须重新分配新的足够的空间给数组;但是列表不需要全部重新分配,只要分配多余的空间给新来的元素,并用随机的内存地址串在一起。
    但是要读取列表时,不能直接读取后面的元素,必须先访问元素1,然后元素2,直到最后一个元素。数组可以随意访问。
    选择排序或者叫冒泡排序:

    def findSmallest(arr):
                    smallest = arr[0]
                    smallest_index=0
                    for i in range(1,len(arr)): #随机找到列表中的数
                        if arr[i]< smallest:    #比较大小
                        smallest_index=i
                    return smallest_index
                def selectionSort(arr):
                    newArr=[]
                    for i in range(len(arr)):
                        smallest=findSmallest(arr)
                        newArr.append(arr.pop(smallest)) #在每个最小的数之后添加一个比较大的数,好排序
                return newArr
                print(selectionSort([1,5,15,4,3,8,6,9,10]))

    3. 递归:
    递归函数是调用自己。

    4. 快速排序:

    def quicksort(array):
                    if len(array) <2:
                        return array
                    else: 
                        pivot = array[0]
                        less=[i for i in array[1:] if i <= pivot] #由所有小于基准值的元素组成的子数组
                        greater=[i for i in array[1:] if i>pivot]
                        return quicksort(less)+[pivot]+quicksort(greater)
                print quicksort([1,4,2,3])

    5. 散列表(字典):
    6. 广度优先搜索:
    先在一度关系中搜索,没有结果之后再从二度关系中搜索。
    队列是先进先出的,栈是后进先出的

    from collections import deque
                search_queue = deque()    #创建一个队列
                search_queue+=graph["you"]    #将你的另据都加入到这个搜索队列中:
                def person_is_seller(name):
                    return name[-1] == 'm'    #判断这个人是否为想要的结果的函数。
                while search_queue:    #只要队列不为空
                    person=search_queue.popleft()    #就取出其中第一人
                    if person_is_seller(person):    #检查这个人是否是想要的
                        print (person+"is a xxx")
                        return True
                    else:
                        search_queue+=graph[person]    #不是想要找的对象,将这个朋友加入到搜索队列
                return False    #如果到了这里,说明队列赵总没有想要的结果,队列已为空。
            
    广度优先搜索代码:
                def search(name):
                    search_queue=deque()
                    search_queue+=graph[name]
                    searched=[]    #这个数组用于记录检查过的人
                    while search_queue:
                        person=search_queue.popleft()
                        if not person in searched:
                            if person_is_seller(person):
                                print person+'is a xxxx'
                                return True
                            else:
                                search_queue+=graph[person]
                                searched.append(person)
                    retuen False

    7. 狄克斯特拉算法:
    使用广度优先搜索,将得到数量最少的路径,但不一定是最快最方便的路径。
    狄克斯特拉算法,相当于在广度优先算法的基础上加了权重。
    关键理念: 找到最便宜的节点,并确保没有到该节点更便宜的路径。 如果有负权边,就不能试用此算法。

    def find_lowest_cost_node(costs):
                    lowest_cost=float('inf')
                    lowest_cost_node= None
                    for node in costs: 
                        cost=costs[node]
                        if cost< lowest_cost & node not in processed:    #如果当前节点未处理,且成本更低
                            lowest_cost=cost
                            lowest_cost_node=node
                    return lowest_cost_node
                    
                node=find_lowest_cost_node(costs):    #在未处理的节点找到开销最小的点
                while node is not None:        #这个循环在所有节点被处理过后结束
                    cost =costs[node]
                    neighbors = graph[node]
                    for n in neighbors.keys():        #遍历当前节点的所有邻居
                        new_cost=cost+nighbors[n]
                        if costs[n] > new_cost:        #如果经过当前节点离邻居更近
                            costs[n] = new_cost        #就更新改邻居的开销
                            parents[n]=node        #同事将该邻居的父节点设置为当前节点
                    processed.append(node)        
                    node=find_lowest_cost_node(costs)     #找出接下来要处理的节点,并循环

    8. 贪婪算法:
    每一步都采取最优的做法,最终得到的就是全局最优解。

    9. 动态规划:
    先解决子问题,再解决主问题。

    10. K最近邻算法:
    给一个对象分类,看离它最近的三个对象是什么类型,就是3最近邻算法。
    可以用在推荐系统中,在每位用户注册时就让他们指出自己喜欢的对象和喜欢的程度。 用户给使用过的对象评分,哪一类的评分最高,就推荐哪一类的对象。
    要挑选适当的指标,考虑回归性。

    11. 二叉查找树

    12. 反向索引: 一个散列表,将单词映射到包含它的页面。

    13. 傅里叶变换:

    14. 并行算法: 提高算法速度,让他们能够在多个内核中并行地执行。

    15. MapReduce: 分布式算法, 用hadoop执行。 基于映射(map)函数和归并(reduce)函数。
    归并函数是将一个数组转换成一个元素。

    16. 布隆过滤器和HyperLogLog:
    布隆过滤器是一种概率性数据结构,HyperLogLog是类似于布隆过滤器的算法, 这两者都不是准确的结果,但是是大概率的结果。

    17. SHA算法: 安全散列算法: 用来判断两个文件是否相同
    SHA是一个散列函数, 它生成一个散列值(一个较短的字符串),用于促成索引。,用散列值判断文件是否相同,检查密码。

    18. Diffie-Hellman秘钥交换: 公钥和私钥。

    19. 线性规划:
    用于在给定约束条件下最大限度地改善指定的指标。

  • 相关阅读:
    为什么要用do-while(0)?
    网络字节序&大小端存储
    sql语句w3school教程
    C++编码规范
    std::deque双端队列介绍
    gdb基本操作
    gdb调试多线程
    数据库基础
    删除vector所有元素
    stl迭代器失效
  • 原文地址:https://www.cnblogs.com/spencersun/p/9549334.html
Copyright © 2011-2022 走看看