python 算法开发笔记

前言

最近看完《算法图解》对python的算法有点了解,特记录下来

算法概括

  1. 二分查找的速度比简单查找快得多
  2. 算法运行时间用大O表示法来表示。从起增速的角度度量的。
  3. O(log n) 比O(n)快,需要搜索的元素越多,前者比后者就快越多。
  4. 数组的速度:读取O(1),插入O(n),删除O(n)
    链表的速度:读取O(n),插入O(1),删除O(1)

选择排序

#选择排序
def selectSort(arr):
    newArr = []
    oldArr = arr.copy()
    for i in  range(len(arr)):
        mix_index = 0
        #遍历查找oldArr中最低的元素,并删除添加到新数组中
        for i in range(1,len(oldArr)):
            if oldArr[mix_index] > oldArr[i]:
                mix_index = i
        newArr.append(oldArr[mix_index])
        oldArr.pop(mix_index)

    return newArr

递归

  1. 递归函数有两个要点:
    1、基线条件,就是停止调用,跳出递归的条件
    2、递归条件,指函数调用自己
  2. 如果你对递归有深入的认识,函数式编程语言学习起来将会更容易。Haskell等函数式编程语言没有循环,因此你只能使用递归来编写函数。

快速排序

  1. 工作原理:
    1、找出简单的基线条件
    2、确定如何缩小问题的规模,使其符合基线条件
  2. 归纳证明是一种证明算法行之有效的方式,它分两步:基线条件和归纳条件。归纳条件就是证明对一个元素管用、对两个、三个元素也管用,以此类推。
  3. 快速排序的平均运行时间是O(nlogn),最高是O(n2)
#快速排序
def quickSort(arr):
    #基线条件
    if len(arr) < 2:
        return arr
    else:
        #基准值
        pivot = arr[0]
        less = []
        gretter = []
        for i in arr[1:]:
            if i > pivot:
                gretter.append(i)
            else:
                less.append(i)
        #用递归进行反复排序
        return quickSort(less) + [pivot] + quickSort(gretter)

散列函数

  1. 在python和OC里面,就是字典的称呼,也称为映射、散列映射、关联数组。散列函数的运行速度是O(1)。
  2. 散列函数的性能:
    平均情况:查找O(1),插入O(1),删除O(1)
    最慢情况:查找O(n),插入O(n),删除O(n)
  3. 优化散列函数:
    1、较低的填装因子,不要填满全部空位;
    2、良好的散列函数,因子要均匀散布,映射范围要尽可能地大。

广度优先搜索

  1. 属于图算法的一种,擅长找出两者最短距离,解决最短路径问题
  2. 步骤:
    1、使用图来建立问题模型
    2、使用广度优先搜索解决问题
  3. 查找到f的路径:
#广度优先搜索
#广度优先搜索
from collections import deque #引入堆(队列)
def search_queue(dic):
    searchQueue = deque()
    searchQueue.append(dic['a'])
    searched = [] #已搜索队列
    while searchQueue:#只要队列不为空
        letter = searchQueue.popleft()
        if letter not in searched:
            if letter[-1] == 'f':
                print("找到终点了")
                return True
            else:
                for each in letter:
                    searchQueue.append(dic[each])
                searched.append(letter)
    return False

 dic = {}
    dic['a'] = ['b','c']
    dic['b'] = ['d']
    dic['c'] = ['e']
    dic['d'] = ['g']
    dic['e'] = ['f']
    dic['f'] = []
    dic['g'] = []
    print(search_queue(dic))

狄克斯特拉算法

  1. 在每个节点中加上权重,是针对加权图进行计算,但只适用于有向无环图DAG,且不能用于有负权边的。
  2. 对于有负权边的图,找出最短路径,可用贝尔曼-福德算法

贪婪算法

  1. 每步都选择局部最优解,未必是整体的最优解,但会非常接近最优解,速度快
  2. NP完全问题,并没有快速解决的方案,最佳的做法是使用近似算法
  3. 贪婪算法易于实现,运行速度快,是不错的近似算法
  4. NP完全问题的特征:
    1、元素较少时算法运行速度非常快,但随着元素数量的增加,速度会变得非常慢。
    2、涉及“所有组合”的问题通常都是NP完全问题
    3、不能把问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。
    4、如果问题涉及序列(如旅行商问题洪的城市序列)且难以解决,它可能就是NP完全问题。
    5、如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题。
    6、如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是NP完全问题

动态规划

  1. 动态规划可以在给定约束条件下找到最优解。
  2. 在问题可分解为彼此独立且离散的子问题时,就可使用动态规划来解决,每种动态规划解决方案都涉及网格。
  3. 每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题
  4. 没有放之四海而皆准的计算动态规划解决方案的公式。

K最近邻算法

  1. 大数据比较常用的算法,抽取特征值计算与其他元素的最近值来分类
  2. 回归就是预测的结果,分类就是编组
  3. 计算两个元素的距离时,有使用距离公式,也有使用余弦相似度

其他

  1. 二叉树,如果对数据库或高级数据结构感兴趣,可以研究以下数据结构:B树,红黑树,堆,伸展树
  2. 反向索引,key为单词,值为包含指定单词的页面,常用于创建搜索引擎
  3. 傅里叶变换,太多地方用到,只要能转换成数字信号等元素都能用到这个算法
  4. 并行算法:
    1、分布式算法,MapReduce,可以用Apache Hadoop来使用它
    2、映射(Map)函数,把一个数组转换成另一个数组
    3、归并(reduce)函数,把一个数组转换成一个元素
  5. 布隆过滤器,概率性数据结构,主要用在去重,监测是否已存在,答案有可能正确,也有可能不正确
    HyperLogLog,类似布隆过滤器的算法
  6. SHA算法,散列函数,根据字符串生成另一个字符串,用于比较文件密码
    局部敏感的散列算法,Simhash,可以监测内容是否大致相同,比较相似度
  7. Diffie——Hellman密钥交换,还有RSA,就是公钥私钥算法。
  8. 线性规划,所有图算法都可以用线性规划来时限,是比较宽泛的框架,其中之一是Simplex算法,如果就查找最优解,可以研究研究线性规划
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 1)这本书为什么值得看: Python语言描述,如果学的Python用这本书学数据结构更合适 2016年出版,内容...
    孙怀阔阅读 12,284评论 0 15
  • 7月份的时候看完这本算法入门书,学习难度比较低,很快就看完了。但是时隔两个月再回想,书中的内容已经了无印象,今天重...
    赫子丰阅读 1,185评论 0 1
  • 第一章 算法简介 按从快到慢的顺序列出5种大O运行时间: O(log n),也叫对数时间,这样的算法包括二分查找。...
    yytester阅读 454评论 0 0
  • 1月17日,俄罗斯西南部罗斯托夫州的一条公路上,苏-27、苏-30和苏-34——三家参加俄罗斯南部军区军事演习的重...
    宝米勒阅读 138评论 0 0
  • 曾经的我们总以为时间还很长,尽情的享受着那一丝美好时光;曾经的我们跌跌撞撞也曾负气悲伤却从来不曾把对方遗...
    智商不在服务区_392f阅读 504评论 0 0