算法基础, 常用算法总结

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

二分查找,选择排序,快速排序,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(name)
    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 []  

时间: 2024-08-05 19:30:20

算法基础, 常用算法总结的相关文章

C++算法之——常用算法总结

http://blog.sina.com.cn/s/blog_61bebe480100v7c7.html 基本的C++算法分为三类:排序算法.树算法.图算法 算法思想有三种:递推.分治.动态规划 以及 贪心算法. 本文将简要介绍上面三类算法,介绍时穿插介绍算法思想. 一.排序算法 1.基本O(n^2)排序算法: (对基本排序算法的时间复杂度分析主要考虑  比较次数.数据交换次数) 冒泡排序:针对数组.本地排序.需要交换数据.O(1)额外空间 选择排序:一般针对数组.本地排序.需要交换数据.O(1

大数据算法-&gt;推荐系统常用算法之基于内容的推荐系统算法

港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一个好的商品,向朋友安利之类的.在以前广告系统不发达的时候,我们也是靠口口相传来进行商品的推广.那么为什么,现在推荐系统变的非常重要了呢?,在以前,我们的商品不像现在的物品一样琳琅满目,我们有时间,可以把商品都浏览一遍在进行选择,因为我们都想选择所有商品中最好的,而现在,由于资源的众多,我们不会用大把

算法基础--贪心算法

贪心算法 算法描述 什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高. 比如说一个算法问题使用暴力解法需要指数级时间,如果能使用动态规划消除重叠子问题,就可以降到多项式级别的时间,如果满足贪心选择性质,那么可以进一步降低时间复杂度,达到线性级别的. 什么是贪心选择性质呢,简单说就是:每一步都做出一个局部最优的选择,最终的结果就是全局最优.注意哦,这是一种特殊性质,其实只有一部分问题拥有这个性质. 比如

冒泡、选择、插入排序算法——基础排序算法详解。

冒泡排序 大(小)的数慢慢“浮”到队列尾端. 原理(步骤): 第一步:比较相邻两数,从小到大排序时,第一个数大于第二个数时,交换两数位置, 第二步:接着对数列中第二对(第二个数和第三个数)重复第一步操作,比完所有数之后最大(小)的数已经在最右边.第一轮结束. 第三步:针对除最后一个数外的数重复一.二步(排完剩下的最后一个数就已经有序). 时间复杂度:(N-1)+(N-2)+...+1 = N*(N-1)/2 复杂度为O(N2). Java实现: public static int[] Bulle

0基础学算法 第二弹 排序

大家好啊,这是0算法基础学算法系列第二篇,上次我在第一弹里讲了关于流程图的内容,我寻思着,这次讲些什么好呢,于是我决定,教大家一个很基础的算法,那就是排序,排序有很多方法,如果你有更多方法请在评论区里留言哦. 排序在程序中特别实用,常用的有快速排序,桶排序,冒泡排序,插入排序等等,在这里我不建议使用冒泡排序或者插入排序,建议桶排序和快速排序,这两个排序非常实用,时间复杂度低,理解起来也很容易,首先,你先思考一下,怎么用程序进行排序,然后你再来看看你的思路合理不合理,最后试着用程序实现它,实现后你

五大常用算法----贪心、动态规划、分支限界、分治算法和回溯算法

五大常用算法之一:贪心算法 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择.必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性. 五大常用算法之二:动态规划算法 五大常用算法之三:分支限界算法

[算法学习笔记]算法基础知识

算法基础知识 算法的五大要素 有穷性:算法必须能够在有限个步骤内完成. 确定性:算法的每一步必须有确定的定义. 输入 输出 可行性:算法的每个步骤都必须能分解为基本的可执行操作,每个步骤都必须能在有限时间内完成 循环不变式 循环中的循环不变式可以帮助我们理解算法的正确性.为了证明算法的正确,必须证明循环不变式的三个性质: 1. 初始化:循环不变式在循环开始之前是正确的. 2. 保持:循环不变式在循环的每一次迭代开始之前是正确的. 3. 终止:在循环结束时,不变式会给出一个可以对判断算法是否正确有

数组概念与基础以及数组常用算法

1.1.1 数组基础 数组(Array)是相同数据类型的数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引来(index)访问它们. 数组是引用数据类型. 数组的三个特点 [1]数组长度是确定.数组一旦申请完空间,长度不能发生变化,用length属性访问. [2]数组的元素都是同一数据类型. [3]数组是有序的 .每个元素通过下标/索引标记,索引从0开始. 1.1.2 内存空间分类(

五大常用算法

http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html 分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)-- 任何一个可以用计

推荐系统中常用算法 以及优点缺点对比

推荐系统中常用算法 以及优点缺点对比 在 推荐系统简介中,我们给出了推荐系统的一般框架.很明显,推荐方法是整个推荐系统中最核心.最关键的部分,很大程度上决定了推荐系统性能的优劣.目前,主要的推荐方法包括:基于内容推荐.协同过滤推荐.基于关联规则推荐.基于效用推荐.基于知识推荐和组合推荐. 一.基于内容推荐 基于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器