算法
文章平均质量分 89
景荣先生
由简到繁,由繁到简!
展开
-
Python之二分查找
二分查找:将查找范围平分为二,对比要查找的属于哪一部分,再将那部分范围继续平分为二,对比属于哪部分,以此类推,最终得到要查找的对象,即为二分查找。注意:查找对象必须是有序序列。二分查找的时间复杂度为对数时间O (log n )。示例:# 二分查找猜大小def search(my_list, item): low = 0 #low和high用于查找指定元素的索引范围 hi...原创 2019-04-12 11:07:11 · 186 阅读 · 0 评论 -
Python图算法之深度优先搜索
深度优先搜索(Depth First Search, DFS):是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。广...原创 2019-04-13 10:04:43 · 5119 阅读 · 0 评论 -
Python图算法之狄克斯特拉算法
可用于类似公交线路用时最短的案例。图算法之狄克斯特拉算法(Dijkstra’s algorithm),包含4个步骤:(1) 找出“最便宜”的节点(权重最小),即可在最短时间内前往的节点。(2) 对于该节点的邻居,检查是否有从起点前往它们的更短路径,如果有,就更新其路径(开销)。(3) 将未处理节点中的“最便宜”的节点重复前面的过程,直到对图中的每个节点都这样做了。(4) 计算最终路径。...原创 2019-04-13 10:13:25 · 449 阅读 · 1 评论 -
Python之prim与kruskal最小生成树算法
普里姆算法(Prim’s algorithm):图论中的一种算法,可在加权连通图里搜索最小生成树。即由此算法搜索到的边所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权重值之和也最小。prim算法基本思路:所有节点分成两个group,一组为已经选取的selected_node(为list类型),一组为candidate_node,首先任取一个节点加入到selected_node,然后...原创 2019-04-13 10:20:17 · 1498 阅读 · 0 评论 -
Python之贪婪算法
NP完全问题:找不到快速算法的问题。识别NP完全问题,以免浪费时间去寻找解决它们的快速算法:没办法判断问题是不是NP完全问题,但还是有一些蛛丝马迹可循的。1、元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。2、涉及“所有组合”的问题通常是NP完全问题。3、不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。4、如果问题涉及序列(如旅行商问题中的...原创 2019-04-13 10:28:01 · 810 阅读 · 0 评论 -
Python栈的应用之中缀、前缀和后缀表达式
中缀表达式:是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4)。与前缀表达式(例:+ 3 4)或后缀表达式(例:3 4 +)相比,中缀表达式不容易被电脑解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。与前缀或后缀表达式不同的是,中缀表达式中括号是必需的。计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。如:(a + b) * c...原创 2019-04-16 09:57:19 · 2465 阅读 · 0 评论 -
Python自定义列表类
使用链表构建列表类。链表:由一系列节点(链表中每个元素称为节点)组成。每个节点包括两部分:一个是存储数据元素的数据域(Data field),另一个是存储下一个节点地址的指针域(Pointer field)。下面这些方法的实现性能与Python的内置列表list不同,Python中的列表的实现是基于数组的。打印显示类:class Display(object): def show(sel...原创 2019-04-17 08:38:26 · 6085 阅读 · 0 评论 -
Python自定义双端队列类
双端队列(Deque):由一系列有序的元素组织而成,元素可以从队首或队尾插入、删除。Python自带Deque模块,使用时可引用from collections import deque。自定义双端队列类:class Deque(object): def __init__(self): #初始化空队列 self.items = [] def isEmpty(self):...原创 2019-04-17 08:40:52 · 1612 阅读 · 0 评论 -
Python自定义栈类
栈(stack):又称为堆栈或堆叠,是计算机科学中的一种抽象数据类型,只允许在有序的线性数据集合的一端(称为堆栈顶端top)进行加入数据(push)和移除数据(pop)的运算。按照后进先出(LIFO, Last In First Out)的原理运作。Python中没有Stack类,需要自定义。自定义栈类:class Stack(object): def __init__(self): ...原创 2019-04-17 09:05:07 · 2198 阅读 · 0 评论 -
Python之动态规划算法
动态规划算法:是一种解决棘手问题的方法,它将问题分成小问题,并先着手解决这些小问题。但仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用。在问题可分解为彼此独立且离散的子问题时,就可使用动态规划来解决。设计动态规划解决方案的通用小贴士:1、每个动态规划算法都从一个网格开始。2、单元格中的值通常就是要优化的值。3、每个单元格都是一个子问题,因此应考虑如何将问题分成子问题,这...原创 2019-04-15 10:35:10 · 4512 阅读 · 0 评论 -
Python之K最近邻算法
K最近邻(k-nearest neighbours,KNN)算法:是指给定一个训练数据集,将新输入的实例,在训练数据集中找到与该实例最邻近的K个实例(K表示指定的最近邻的数量,K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。关于K的经验规则是:如果有N位用户,应考虑sqrt(N)个邻居。KNN算法用于分类和回归,需要考虑最近的邻居:1、分类就是编组;2、回归就是预...原创 2019-04-15 10:48:35 · 1991 阅读 · 0 评论 -
Python之BST二叉查找树
BST搜索树:在一个二叉搜索树中,如果左子树中键值Key都小于父节点,而右子树中键值Key都大于父节点,我们将这种树称为BST搜索树。注意:移动树的节点时,被移动节点及其原新两个位置的父、子节点的指向均需重新指向,保证各节点指向正确。示例:# 创建树的节点类class TreeNode(object): # 初始化树的节点 def __init__(self, key, val, le...原创 2019-04-15 10:52:24 · 439 阅读 · 1 评论 -
Python之平衡二叉搜索树(AVL树)
平衡二叉搜索树(Balanced Binary Tree):是一种结构平衡的二叉搜索树,即叶节点高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。它能在O(log n)内完成插入、查找和删除操作,最早被发明的平衡二叉搜索树为AVL树。常见的平衡二叉搜索树有:AVL树、红黑树、Treap、节点大小平衡树。注意:移动树的节点时,被移动节点及其原新两个位置的父、子节点的指向均需重新指向,...原创 2019-04-15 11:01:26 · 2096 阅读 · 2 评论 -
Python之turtle可视化递归探索迷宫
maze.txt内容+++++++++++++++++++++++ ++ ++ + + + +++++++++ + + ++ + +++++ +++ +++++ +++ + ++ ++++ + + ++++++ + + + + ++++++ +++ + + ++ ++ ...原创 2019-04-15 11:07:32 · 6659 阅读 · 10 评论 -
Python之动态规划(最少硬币数找零)
完整代码:# 动态规划最少硬币数找零def dpMakeChange(coinValueList, change, minCoins, coinsUsed): for cents in range(change + 1): #依次循环从0到所需兑换面值的每一个面值 coinCount = cents #初始化最优解为当前面值数 newCoin = 1 #初始化找零硬币面...原创 2019-04-15 11:10:10 · 2799 阅读 · 1 评论 -
Python之队列模拟算法(打印机问题)
模拟打印机问题:如果平均每天任意一个小时实验室里都有10个学生,并且每人需要发起2次打印任务,平均每小时就有20个打印任务,即平均每180秒生成一个打印任务,那么,在任意一秒,产生一个打印任务的概率就是1/180,每个打印任务的页数从1到20页不等,计算平均等待时长。以下为主要的模拟过程:1、创建一个打印任务队列。每个任务在生成时被赋予一个“时间节点”。队列在开始时是空的。2、对于每一秒(...原创 2019-04-15 11:27:33 · 1746 阅读 · 0 评论 -
Python之队列模拟算法(烫手山芋问题)
烫手山芋即击鼓传花,7人传山芋,叫到7的人退出,直到最后一人。完整代码:# 自定义队列类class Queue(object): def __init__(self): #初始化空队列 self.items = [] def isEmpty(self): #是否为空 return self.items == [] ...原创 2019-04-15 11:30:18 · 870 阅读 · 0 评论 -
Python图算法之广度优先搜索
图算法之广度优先搜索(breadth-first search,BFS):广度优先搜索是一种用于图的查找算法,可解决以下两类问题:第一类问题:从节点A出发,有前往节点B的路径吗?第二类问题:从节点A出发,前往节点B的哪条路径最短?需要两个步骤:(1) 使用图来建立问题模型。(2) 使用广度优先搜索解决问题。什么是图:图用于模拟不同的东西是如何相连的,由节点(node)和边(edge)...原创 2019-04-13 09:13:13 · 1382 阅读 · 0 评论 -
Python之快速排序
快速排序:通过基准值将要排序的数据分割成独立的两部分,其中一部分的所有数据都比基准值要小,另外一部分的所有数据都比基准值要大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此类推,使整个数据变成有序序列。快速排序的速度取决于选择的基准值,有序序列中选择第一个值作为基准值是最糟情况O(n),基准值选取优先级:三数取中 > 随机基准 > 固定基准。使用分而...原创 2019-04-13 09:03:22 · 390 阅读 · 0 评论 -
Python之归并排序
归并排序:是一种递归算法,它持续地将一个列表平均分成两半。如果列表是空的或者只有一个元素,那么它就被排好了(最基本情况)。如果列表里的元素超过一个,就把列表继续拆分,然后再分别对两个部分调用递归排序。一旦这两个部分都排好了,那么就把这两个列表结合在一起,组成一个有序的新列表。归并排序使用分而治之的策略,其时间复杂度为O(nlogn)。# 将左右子列表按升序依次合并为一个新列表def mer...原创 2019-04-13 08:55:26 · 205 阅读 · 0 评论 -
简说大O表示法
大O表示法:算法的时间复杂度通常用大O符号表述,定义为T[n] = O(f(n))。称函数T(n)以f(n)为界或者称T(n)受限于f(n)。 如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n)。T(n)称为这一算法的“时间复杂度”。当输入量n逐渐加大时,时间复杂度的极限情形称为算法的“渐近时间复杂度”。最坏时间复杂度:算法的时间复杂度不仅与语句频度有关,还与问题规模及输入实...原创 2019-04-12 10:45:24 · 1830 阅读 · 0 评论 -
Python基本数据类型的时间和空间复杂度
常见的时间复杂度高低排序:O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n²logn)<O(n³)<O(2ⁿ)<O(n!)<O(nⁿ)列表(List):python的列表内部实现是数组(具体实现要看解析器),因此就有组数的特点。超过容量会增加更多的容量,set, get 是O(1),但del, insert, in...转载 2019-04-11 10:14:57 · 2461 阅读 · 0 评论 -
Python之冒泡排序
冒泡排序(Bubble Sort):是一种简单的、非常低效的排序算法。冒泡排序依次地走访要排序的数列,一次比较两个元素,如果他们的顺序错误(如从大到小、首字母从A到Z)就把他们交换位置,直到没有相邻元素需要交换,即该数列已经排序完成。这个算法名字的由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。短路冒...原创 2019-04-12 11:25:04 · 279 阅读 · 0 评论 -
Python之递归
递归:递归就是自己调用自己,无限循环下去,直到遇到终止条件(必须有,否则程序会崩溃)。递归与循环:递归更容易理解,也更容易出现bug;循环性能更高。使用递归要有一个停止递归的条件,否则会一直循环下去,最后栈溢出。 所以每个递归函数要有两个部分:基线条件和递归条件。基线条件:指的是函数不再调用自己的条件,从而避免形成无限循环。涉及list的递归,基线条件通常是list为空或只包含一个元...原创 2019-04-12 12:03:41 · 292 阅读 · 0 评论 -
Python双端队列之回文词判定
双端队列(Deque):由一系列有序的元素组织而成,元素可以从队首或队尾插入、删除。Python自带Deque模块,使用时需引用from collections import deque。回文词:指的是正读和反读都一样的词,如:radar、toot 和 madam,还有一些古诗词。如:《两相思》【宋】李禺思妻诗枯眼望遥山隔水,往来曾见几心知?壶空怕酌一杯酒,笔下难成和韵诗。途路阻人离...原创 2019-04-16 08:31:35 · 939 阅读 · 0 评论 -
Python栈的应用之二进制与十进制转换
示例:233转为2进制:除2法,转8进制除8,转16进制除16二进制数的尾:233//2=116 余1 116//2=58 余0 58//2=29 余0 29//2=14 余1 14//2=7 余0 7//2=3 余1 3//2=1...原创 2019-04-16 08:40:07 · 1711 阅读 · 1 评论 -
Python栈的应用之检测括号是否闭合
完整代码:"""判断代码括号平衡,即是否闭合"""# 定义栈类class Stack(object): def __init__(self): #初始化空栈 self.items = [] def isEmpty(self): #是否为空 return self.items == [] de...原创 2019-04-16 09:35:04 · 769 阅读 · 0 评论 -
Python自定义队列类
队列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。"""Queue是Python中的标准库,可以直接import Queue引用。此处是自定义Queue类...原创 2019-04-16 10:01:28 · 1880 阅读 · 0 评论 -
Python自定义二叉堆类
二叉堆有两种:最小成员key排在队首的称为“最小堆(min heap)”;最大key排在队首的是“最大堆(max heap)”,这是一种优先队列的实现方式。优先队列的出队(Dequeue)操作和队列一样,都是从队首出队。但在优先队列内部,数据项的次序是由它们的“优先级”来确定的:有最高优先级的数据项排在队首,而优先级最低的数据项则排在队尾。这样,优先队列的入队(Enqueue)操作就需要将数据项...原创 2019-04-16 10:10:49 · 332 阅读 · 0 评论 -
Python自定义二叉树类
树的基本术语:节点(Node):是树的基本构成部分。它可以有其他专属名称,称之为“键(key)”。 一个节点可能有更多的信息,称之为“负载(payload)”。尽管负载信息和树的许多算法并不直接相关,但是它对于树的应用至关重要。边(Edge):也是树的基本构成部分。边连接两个节点,并表示它们之间存在联系。每个节点(除了根节点)都有且只有一条与其他节点相连的入边(指向该节点的边),每个节点可能有...原创 2019-04-16 10:16:38 · 2192 阅读 · 0 评论 -
Python自定义邻接表图类
图抽象数据类型(ADT)的术语:顶点(Vertex):也称节点(node),是图的基础部分。具有名称标识“key”。顶点也可以有附加信息项“playload”。边(Edge):也称弧(arc),也是图的基础组成部分。如果一条边连接两个顶点,则表示两者具有联系。边可以是单向的,也可以是双向的。如果图中的边都是单向的,则称这个图是“有向图(directed graph/digraph)”。权重(...原创 2019-04-16 10:21:57 · 3169 阅读 · 0 评论 -
Python自定义散列表类
散列:是一种对数据的处理方法,通过某种特定的函数/算法将要检索的项与用来检索的索引(该索引称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构(该数据结构称为散列表)。散列表:是一种数据集合,其中每个数据都通过某种特定的方式进行存储,以方面日后查找。槽:散列表的每一个位置叫做槽,能够存放一个数据项,并以从0开始递增的整数命名。散列函数:某个数据项与在散列表中存储它的槽之间的映射叫做散列...原创 2019-04-16 10:29:11 · 731 阅读 · 2 评论 -
Python自定义数据类型的几个魔术方法
Python创建自定义数据类型并访问,需要在定义类的时候对一些魔法方法逐一实现。repr(obj)函数:此法给python解释器运行。str(obj)函数:此法给人阅读。说明:1、str(obj)函数先查找obj.str()方法,若有此方法,则调用并返回结果;2、若没有obj.str()方法,则再查找obj.repr()方法,若有此方法,则调用并返回结果;3、若obj.__repr__...原创 2019-04-16 10:34:48 · 1563 阅读 · 0 评论 -
Python之选择排序
选择排序:首先从待排序的数据中选出最小(或最大)的一个元素,放在已排序序列的末尾,然后再从剩余未排序元素中继续寻找最小(或最大)元素,放到已排序序列的末尾,以此类推,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。# 查找数组中最小元素,并返回对应索引def findSmallest(arr): smallest = arr[0] #初始对比值及索引 small...原创 2019-04-13 08:39:38 · 161 阅读 · 0 评论 -
Python之插入排序
插入排序(Insertion Sort):是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。def insertionSort(alist): n =...原创 2019-04-13 08:46:51 · 130 阅读 · 0 评论 -
Python之希尔排序
希尔排序:也称缩小增量排序,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序的基本思想:1、先将整个待排序列分割成若干个子序列(由相隔某个“增量”的元素组成)分别进行直接插入排序;2、然后依次缩减增量再进行排序;3、待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。4、因直接插入排序在元素基本有序的情况下(接近最好情况)效率很高,所以希尔...原创 2019-04-13 08:52:22 · 178 阅读 · 0 评论 -
Python之解析树生成函数与解析树求值
树的遍历包括前序遍历(preorder),中序遍历(inorder)和后序遍历(postorder)。前序遍历(preorder):在前序遍历中,先访问根节点,然后递归地前序遍历访问左子树,再递归地前序遍历访问右子树。中序遍历(inorder):在中序遍历中,递归地中序遍历访问左子树,然后访问根节点,最后再递归地中序遍历访问右子树。后序遍历(postorder):在后序遍历中,先递归地后序遍...原创 2019-04-15 11:33:01 · 1847 阅读 · 0 评论