算法基础, 常用算法总结

接触的一些算法,搞不清楚搞得清楚的 列一个,大部分是最近看算法图解里边的算法,平常也经常用到,包括

二分查找,选择排序,快速排序,BFS DFS 动态规划

def binary_search(arr,item):
    #二分查找
    l,h=0,len(arr)-1
    while l<h:
        mid=(l+h)//2
        if arr[mid]<item:
            l = mid + 1
        elif arr[mid]>item:
            h=mid-1
        else:
            return  mid
    return None

def selectsort(arr):
    #选择排序
    n=len(arr)
    if n<2:return 
    start=0
    while start<n:
        res=[]
        index=start
        #每次找剩下的最小值
        for i in range(start+1,len(arr)):
            if arr[i] < arr[index]:
                index=i
            
        t=arr[index]
        arr[index]=arr[start]
        arr[start]=t
        start+=1


def quicksort(arr):
    #快速排序
    if len(arr)<2:return arr
    else:
        pivot=arr[0]
        #每次把序列分成小于基准和大于基准的
        less=[i for i in arr[1:] if i<=pivot]
        greator=[i for i in arr[1:] if i >pivot]
        return quicksort(less) + [pivot]+ quicksort(greator)

        
def bfs(node,target):
    #查找路径是否存在
    from collections import deque
    search_queue=deque()
    searched=[]
    search_queue.append(node)
    while search_queue:
        p=search_queue.popleft()
        if p not in searched:
            if p == target:
                return True
            else:
                search_queue.append(p.next)
                searched.append(p)
    return False

    
class Node:
   
    def __init__(self,x,y,step):
        self.x=x
        self.y=y
        self.step=step
        pass


def bfs(Arr,target):
    #走迷宫问题
    from collections import deque
    r=len(Arr)
    c=len(Arr[0])
    visit=Arr[None]*c
    for i in range(r):
        visti[i]=[0]*r
    
    step=[[-1,0],[1,0],[0,-1],[0,1]]
    q=deque()
    q.append(Node(0,0,0))
    while q:
        cur=q.popleft()
        if cur.x==target[0] and cur.y==target[1]:
            return cur.step
        for i in step:
            nr=cur[0]+i[0]
            nc=cur[1]+i[1]
            if nr>=0 and nc>=0 and nr<r and nc<c and visit[nr][nc]==0:
                visit[nr][nc]=steps
                if Arr[nr][nc]==1:#能走加入队列累加步数
                    q.append(Node(nr,nc,cur.step+1))

    return 0


def dp(dicstuf,bag):
    #动态规划 背包问题
    #dicstruf 一组二位数组,[[1,2]]  第一位表示重量,第二位表示价值
    cell=[None]*len(dicstuf)
    for i in range(len(dicstuf)):
        cell[i]=[0]*bag
    
    for i in len(dicstuf):
        for j in bag:
            if i==0 and dicstuf[i][0]<j:
                cell[i][j]=dicstuf[i][1]
            else:
                if dicstuf[i][0]<j:# 比较上一个单元格和当前单元格放了当前商品+剩余价值
                    cell[i][j]=max(cell[i-1][j],cell[i-1][j-dicstuf[i][0]])
                else:
                    cell[i][j]=cell[i-1][j]

    return cell[-1][-1]

def dfs(nums,k):
    #部分求和问题, nums为数字序列,k为和,求一个序列和为k
    #类似与二叉树求路径和为k的路径,nums又n个数,构建n层的完全二叉树,根节点    
    #为0,每个左节点为0,右子节点为nums[c],c为层数,然后遍历所有路径求路径和为k的路径就是的··· 前边有一次做的lintcode题目就是这个·
    res=[]
    def dfssum(i,sum):
        if i >=len(nums):
            return sum==k
        if sum>k:
            return False
        if dfssum(i+1,sum):
            return True
        if dfssum(i+1,sum+nums[i]):
            res.append(nums[i])
            return True
        return False

    if dfssum(0,0):return res
    return []  



 

posted @ 2017-06-25 16:47  季末的寂寞  阅读(297)  评论(0编辑  收藏  举报