算法

常见算法:
分治法,递归法,贪心法,动态规划法,迭代法,枚举法,回溯法
数据结构的种类:
1.数组: 一排紧密相连的可数内存 一维数组 二维数组 多维数组等
2.链表:
3.堆栈: 后进先出, 压栈,出栈,
4.队列: 先进先出,
5.树形结构
6.图
7.哈希表

1章
1.1
算法是一组完成任务的指令,任何代码片段都可视为算法
二分查找(二分查找的时间为对数时间,low,high,mid )
时间复杂度:T(n)=T(n/2)+o(1)
只适合有序列表
高低指标 一次折叠一半
在这里插入图片描述
代码:

import math
def bin_search(arr, item):
    low = 0
    high = len(arr)-1
    while low <= high:                       //循环结束条件 数组只剩一个元素
        mid = math.floor((low+high)/2)
        guess = arr[mid]
        if guess == item:
            return mid
        elif guess > item:
            high = mid-1
        else:
            low = mid+1
    return None

1.2大O表示法(最糟糕情况下运行时间,n为操作数,旅行商问题)

2章
冒泡排序法:
冒泡排序法又称为交换排序法,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。 核心:比n-1次,每次比n-1-j下。

def sort(arr):
    for j in range(len(arr)-1):
        for i in range(len(arr)-1-j):
             t = 0
             if arr[i]>arr[i+1]:
                 t = arr[i]
                 arr[i] = arr[i+1]
                 arr[i+1] = t
    return arr

2.1数组和链表(数组适合查找,链表适合增删)
2.2选择排序
反复从未排序的数列中取出最小的元素,加入到另一个数列中,最后的结果即为已排序的数列。
一次找一个最值,旧列表减值,新列表加值
在这里插入图片描述
代码:

def select_sort(array):          
    lis = []
    while len(array) > 0:
        pos = array[0]
        for value in array:
            if value > pos:
                pos = value
        array.remove(pos)
        lis.append(pos)
    return lis

3章
每个递归函数都有两部分:
基线条件和递归条件
递归条件指的是函数调用自己,而基线条件指的是函数不再调用自己,从而避免形成无限循环

计算机在内部使用被称为 调用栈 的栈。

def greet(name):
    print("hello")
    function1()
    print("hi")                 
    function2()     

递归调用栈
计算阶乘

def function(num):
    if num == 1:
        return 1
    else:
        return num*function(num-1)  

4章
分而治之(divide and conquer D&C)
快速排序:
1.选择基准值 2.将数组分成两个子数组:小于基准值的元素和大于基准值的元素
3.对这两个子数组进行快速排序
时间复杂度 一般为n*logn 最差情况下为n^2.
代码:
找一基准值,大小放两边
在这里插入图片描述

def quicksort(array):
    if len(array)<2:
        return array
    else:
        p = array[0]          //p为基准值
        low = [i for i in array[1:] if i<=p]
        big = [i for i in array[1:] if i>p]
        return quicksort(low) + [p] + quicksort(big)

归并排序
时间复杂度:T(n)=2T(n/2)+o(n) 子问题数目子问题规模 n*logn

def merge_sort(arr):
    if len(arr)<=1:
        return arr
    mid = len(arr)//2
    left=merge_sort(arr[:mid])
    right=merge_sort(arr[mid:])
    return merge(left, right)
def merge(a, b):
    c=[]
    h=j=0
    while j<len(a) and h<len(b):
        if a[j]<b[h]:
            c.append(a[j])
            j+=1
        else:
            c.append(b[h])
            h+=1
    if j==len(a):
        for i in b[h:]:
            c.append(i)
    else:
        for i in a[j:]:
            c.append(i)
    return c

5章
散列表(将输入映射到数字,由键和值组成)
python提供的散列表实现为字典,可使用函数dict来创建散列表
(1.用于查找 模拟映射关系,
2.防止重复dict.get(’ '),
3.用作缓存(网站将数据记住,不再重新计算))

def get_page(url):
    if cache.get(url):
        return cache[url]
    else:
        data = get_data_from_server(url)
        cache[url] = data
        return data

冲突:给两个键分配的位置相同

填装因子 散列表包含的元素数 / 位置总数 填装因子越低,发生冲突的可能性越小,散列表的性能越高。
一旦填装因子大于0.7,调整散列表的长度

6章 图
解决 最短路径问题 的问题算法被称为 广度优先搜索 《队列 先进先出 first in first out 的数据结构》
1:从节点A出发,有前往节点B的路径吗?
2:从节点A出发,前往节点B的哪条路径最短?

from collections import deque
search_deque = deque()
search_deque += graph[''you'']
searched = [ ]                  //使用一个列表来记录检查过的人
while search_queue:
   person = search_queue.popleft()
   if person not in searched:
       if person_is_seller(person):
           print(' ')
           return True
       else:
           search_queue += graph[person]
           searched.append(person)
return False 

def person_is_seller(name):
    return name == 'mmmm'

运行时间 广度优先搜索的运行时间为O (V+E) V为定点数 E为边数

第7章
缔结特斯拉 算法 (只适应于有向无环图)
权重 带权重的图为加权图 不带权重的图为非加权图

(…)

第8章
贪婪算法
(每步都采取最优的做法)
背包问题:
集合覆盖问题
代码:

states_needed = set( ['m','w','o','i','n','u'] )  //要覆盖的集合   集合类似于列表,同样的元素只能出现一次
stations['  '] = set( ['m','o','i'] )         键为广播台名称 , 值为覆盖的集合
while states_needed:
    best_station = None
    states_covered = set()
    for station,states_for_station in stations.items():
        covered = states_needed & states_for_station
        if len(covered) > len(states_covered):
            best_station =station
            states_covered =covered
    states_needed-=states_covered
    final_stations.add(best_station) 

np完全问题

9章:动态规划
(动态规划先解决子问题,再逐步解决大问题)
背包问题:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值