《算法图解》代码实现和改进

来源:互联网 发布:php 缺省值 编辑:程序博客网 时间:2024/05/20 20:46

《算法图解》代码实现和改进

请随意观看表演

  • 二分查找
  • 数组和链表
  • 递归
  • 递归条件和基线条件
  • 快速排序
  • 散列表
  • 广度优先搜索
  • 狄克斯特拉算法
  • 贪婪算法

二分查找

def bin_search(list,item):    low = 0    high = len(list) - 1        while low<=high:        mid = (low+high)//2 #得到中间值         guess = list[mid]        if guess==item:            return mid        elif guess>item:            high = mid-1        else:            low = mid+1        return Nonefunc = lambda x:x%2!=0my_list = list(filter(func,range(0,10)))print(my_list)print(bin_search(my_list,2))print(bin_search(my_list,5))
[1, 3, 5, 7, 9]None2

数组和链表

选择排序

def findSmall(arr):#找到最小    small = arr[0]    small_index = 0    for i in range(1,len(arr)):        if arr[i]<small:            small = arr[i]            small_index = i    return (small_index,small)def selectionSelect(arr):#选择排序,升序    newArr = []    for i in range(len(arr)):        small_index = findSmall(arr)[0]        newArr.append(arr.pop(small_index))    return newArrprint(selectionSelect([i for i in range(10,0,-1)]))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

递归

盒子查找

迭代写法
def lookForKey(mainBox):    pile = mainBox.makePileToLook()    while len(pile):        box = pile.grabBox()        for item in box:            if item.isBox():                pile.append(item)            elif item.isKey():                print("found the key!")
递归写法
def lookForKey(box):    for item in box:        if item.isBox():            lookForKey(item)        elif item.isKey():            print('Found the key at ',item)

基线条件和递归条件

def countdown(i):    print(i)    if i-1:        countdown(i-1)    else : returncountdown(5)
54321

快速排序

分而治之

def Sum(arr):    if len(arr):        return arr[0] + Sum(arr[1:])    else:        return 0Sum([i for i in range(1,101)])
5050

找到最大值

'''错误的写法,out of rangedef getMax(arr,index=0):    if len(arr)>1:        new_index = index + 1        print(new_index,len(arr))        return arr[index] if arr[index]>getMax(arr[new_index:],new_index) else getMax(arr[new_index:],new_index)    else:        return arr[index]        '''    def getMax(arr):    if arr and len(arr)>1:        return arr[0] if arr[0] > getMax(arr[1:]) else getMax(arr[1:])    else:        return arr[0]import randomList = [i for i in range(6)]random.shuffle(List)print(List)getMax(List)
[1, 4, 5, 2, 3, 0]5

快速排序

def quickSort(arr):    if len(arr)<2:        return arr #基线条件,为空或者只含有一个元素的数组    else:        pivot = arr[0] # 递归条件,这里可以随机选取的        small= [i for i in arr[1:] if i<=pivot] #小于基准值组成的子数组        big  = [i for i in arr[1:] if i>pivot]        return quickSort(small) +[pivot] + quickSort(big)print(quickSort([10,5,3]))
[3, 5, 10]

快速排序改进(个人代码,可能有bug)

from random import randrangedef quickSort(arr):    if len(arr)<2:        return arr    else:        flag = 0        for i in range(0,len(arr)-1):            if arr[i]>arr[i+1]:                flag = 1                break        if flag:            index = randrange(0,len(arr))            pivot = arr[index]                        small = [arr[i]  for i in range(0,len(arr)) if i!=index and arr[i]<=pivot]            big = [arr[i]  for i in range(0,len(arr)) if i!=index and arr[i]>pivot]                        return quickSort(small)+[pivot]+quickSort(big)        else:            return arrprint(quickSort([10,5,3,-5]))
[-5, 3, 5, 10]

散列表

python里面实现方式是字典

DNS实现
dns = {}dns['google.com'] = '74.125.239.133'dns['scribd.com'] = '23.235.47.175'site = input('>>> ')print(site,dns.get(site))
>>> google.comgoogle.com 74.125.239.133
投票
voted = {}def check_voter(name):    if voted.get(name):        print('已经投过票')    else:        voted[name] = True        print('可以投票')check_voter('Tom')check_voter('Vic')check_voter('Tom')
可以投票可以投票已经投过票
用户缓存
cache = {}def get_page(url):    if cache.get(url):        return chache[url]#返回缓存数据    else:        data = get_data_from_server(url)#默认配置        cache[url] = data        return data

冲突+性能

填装因子 = 存在的/全部空间

广度优先搜索(BFS)

实现图

graph = {}graph['you'] = ['alice','bob','claire']graph['bob'] = ['anuj','peggy']graph['alice'] = ['peggy']graph['claire']=['thom','jonny']graph['anuj']=[]graph['peggy']=[]graph['thom'] = []graph['jonny'] = []

队列

from collections import deque
type(search_queue)
collections.deque
def person_is_seller(name):    return name[-1] == 'm'def search(name):    search_queue = deque()#创建对列    global graph    search_queue += graph[name]#从谁开始搜索    searched = []#已经搜索,防止无限循环        while search_queue:#只要队列里有人        person = search_queue.popleft()#取出一人        if person not in searched:            if person_is_seller(person):                print(person+' is a mango seller')                return True            else:                search_queue+=graph[person]            searched.append(person)    return Falsesearch('you')
thom is a mango sellerTrue

狄克斯特拉算法

有向无环图、加权图(权值为正)
graph = {}graph['start'] = {}graph['start']['a']=6graph['start']['b'] = 2graph['a']={}graph['a']['fin'] = 1graph['b']={}graph['b']['a']=3graph['b']['fin']=5graph['fin'] = {}#终点没有邻居
infinity = float("inf")#+oo正无穷costs = {}costs['a'] =6costs['b'] =2costs['fin'] = infinity
parents = {}parents['a'] = 'start'parents['b'] = 'start'parents['fin'] = None
processed = []#已经处理过的点
def find_lowest_cost_node(costs):    lowest_cost = float("inf")    lowest_cost_node = None    for node in costs:#遍历所有节点        cost = costs[node]        global processed        if cost<lowest_cost and node not in processed:            lowest_cost = cost            lowest_cost_node = node    return lowest_cost_nodedef get_load(parents,destination):#获得路径    t = parents.get(destination)    print(destination,'<--',end=" ")    while t:        print(t,'<--',end=" ")        t = parents.get(t)    print('None')node = find_lowest_cost_node(costs)while node:#当还有节点可以处理的时候    cost = costs[node]    neighbors = graph[node]    for n in neighbors.keys():        new_cost = cost + neighbors[n]        if new_cost < costs[n]:            costs[n] = new_cost            parents[n] = node            processed.append(node)    node = find_lowest_cost_node(costs)print("cost is ",costs['fin'])get_load(parents,'fin')
cost is  6fin <-- a <-- b <-- start <-- None

贪婪算法(不一定是最优解,非常接近)

集合操作

fruits = set(['avocado','tomato','banana'])vegetables = set(['beets','carrots','tomato'])print('|:并集\n\t',fruits | vegetables)print('&:交集\n\t',fruits & vegetables)print('-:差集\n\t',fruits - vegetables)
|:并集     {'tomato', 'avocado', 'beets', 'carrots', 'banana'}&:交集     {'tomato'}-:差集     {'avocado', 'banana'}

模糊算法--集合覆盖问题

states_needed = set(['mt','wa','or','id','nv','ut','ca','az'])stations = {}stations['kone'] = set(['id','nv','ut'])stations['ktwo'] = set(['wa','id','mt'])stations['kthree'] = set(['or','nv','ca'])stations['kfour'] = set(['nv','ut'])stations['kfive'] = set(['ca','az'])final_stations = set()#最终电台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)    del stations[best_station]#用过的删除    print(final_stations)
{'kfive', 'ktwo', 'kone', 'kthree'}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 餐厅加热保温设备零线带电怎么办 小米手机不小心把照片删了怎么办 华为手机不小心把照片删了怎么办 网易邮箱被改成别人的姓名怎么办 苹果手机忘记id密码和邮箱怎么办 163邮箱下载的附件没有了怎么办 小米自带浏览器打开网页太慢怎么办 再歪一点授权码忘记了怎么办 注册支付宝的手机号不用了怎么办 手机号被别人注册了支付宝怎么办 支付宝账号密码都忘了怎么办 申请微信公众号邮箱被占用怎么办 邮箱注册微博需要手机验证怎么办 苹果手机的ad码忘记了怎么办 苹果手机酷狗音乐没有声音怎么办 在手机屏上不能缷载软件怎么办? 手机酷狗音乐下载歌曲要钱怎么办 酷狗下载歌曲后歌词不见了怎么办 手机酷我音乐缓冲文件损坏怎么办 苹果手机音乐里的歌删掉了怎么办 上课学生把粉笔擦藏起来了怎么办 手机没法解压10g压缩包怎么办 苹果id被锁邮箱也忘记密码怎么办 手机号注册的微信忘记密码怎么办 qq号注册微信忘记密码怎么办 云课堂密码忘记手机号更改了怎么办 孩子做事才要奖励怎么办的教案 员工做事效率低家庭情况不好怎么办 安全云课堂人脸识别失败怎么办 酷我k歌里音乐太少怎么办 酷狗里面的歌没有了怎么办 第一试用网登录密码忘记了怎么办 第一试用网登录密码忘了怎么办 微博登录直播间帐号被锁定怎么办 硫酸不小心弄到皮肤上怎么办 小米平板进水了开不了机怎么办 U盘被弹出后再插没有显示怎么办 视频从U盘传下来不能播放怎么办 微博账号忘了登录名怎么办 迅雷应版权方要求无法下载怎么办? 微信账号忘记密码上面有钱怎么办