
数据结构与算法
weixin_38324954
这个作者很懒,什么都没留下…
展开
-
图的应用:骑士周游问题
1. 骑士周游问题在一个国际象棋棋盘上,一个棋子“马”(骑士)按照“马走日”的规则,从一个格子出发,要走遍所有棋盘格恰好一次。把一个这样的走棋序列称为一次“周游”采用图搜索算法是解决骑士周游问题最容易理解和编程的方案之一。解决方案分为两步:(1)将合法走棋次序表示为一个图(2)采用图搜索算法搜寻一个长度为(行*列-1)的路径,路径上包含每个顶点恰一次1.1 构建骑士周游图将棋盘和走棋步骤构建为图的思路按照“马走日”规则的走棋步骤作为连接边,建立每一个棋盘格的所有合法走棋步骤能够到达的棋盘格关原创 2020-07-17 17:33:21 · 2201 阅读 · 1 评论 -
图的应用:词梯问题
1. 词梯问题从一个单词演变到另一个单词,其中的过程可以经过多个中间单词。要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE:FOOL>>POOL>>POLL>>POLE>>PALE>>SALE>>SAGE我们的目标是找到最短的单词变换序列采用图来解决这个问题的步骤如下:(1)将可能的单词之间的演变关系表达为图(2)采用“广度优先搜索BFS”来搜寻从开始单词到结束单词之间的所有有效路径,选择其中最快到达目标单词的原创 2020-07-17 11:39:39 · 1635 阅读 · 1 评论 -
图及抽象数据类型ADTGraph的python实现
1.图(Graph)graph:重在由一些基本元素构造而来的图,如点、线段等图(Graph)是比树更为一般的结构,也是由边节点和边构成。实际上,树是一种具有特殊性质的图图可以用来表示现实世界中很多事物,如道路交通系统、航班线路、互联网连接、大学中课程的先修次序2.图中常用术语顶点Vertex(也称“节点Node”)是图的基本组成部分,顶点具有名称标识key,也可以携带数据项payload边Edge(也称“弧Arc”)作为2个顶点之间关系的表示,边连接两个顶点。边可以是无向或者有向的,相应的原创 2020-07-17 09:41:56 · 872 阅读 · 0 评论 -
二叉查找树(BST)、AVL树实现及算法分析
1.二叉查找树(Binary Search Tree)用二叉查找树保存key,实现key的快速搜索2.二叉查找树BST的性质比父节点小的key都出现在左子树,比父节点大的key都出现在右子树例如,按照70,31,93,94,14,23,73的顺序插入首先插入的70成为树根31比70小,放到左子节点93比70大,放到右子节点94比93大,放到右子节点14比31小,放到左子节点23比14大,放到其右73比93小,放到其左最后形成的树如下图所示注意:插入顺序不同,生成的BST也不同原创 2020-07-16 11:08:21 · 490 阅读 · 0 评论 -
优先队列和二叉堆
1.优先队列(Priority Queue)前面我们学习了一种FIFO数据结构队列。队列有一种变体称为“优先队列”。如银行窗口取号排队,VIP客户可以插到队首。优先队列的出队跟队列一样从队首出队在优先队列内部,数据项的次序是由“优先级”来确定。高优先级的数据项排在队首,而低优先级的数据项则排在后面。这样,优先队列的入队操作就比较复杂,需要将数据项根据其优先级尽量挤到队列前方。2. 二叉堆(Binary Heap)实现优先队列实现优先队列的经典方案是采用二叉堆数据结构。二叉堆能够将优先队列的入原创 2020-07-15 10:28:46 · 265 阅读 · 0 评论 -
树
1.树——非线性数据结构树在计算机科学的各个领域中被广泛应用:操作系统、图像学、数据库系统、计算机网络跟自然界中的树一样,数据结构也分为:根、枝和叶等三个部分。一般数据结构的图示把根放在上方,叶放在下方。2.分类树的特征(1)分类体系是层次化的。树是一种分层结构,越接近顶部的层越普遍,越接近底部的层越独特。(2)一个节点的子节点与另一个节点的子节点相互之间是隔离、独立的猫属Felis和蝇属Musca下面都有Domestica的同名节点,但相互之间并无任何关联,可以修改其中一个Domestica原创 2020-07-14 15:33:35 · 283 阅读 · 0 评论 -
散列、散列函数
1.散列表(Hash table)散列表(又称哈希表)是一种数据集,其中数据项的存储方式尤其有利于将快速的查找定位。散列表中的每一个存储位置,称为槽(slot),可以用来保存数据项,每个槽有一个唯一的名称例如:一个包含11个槽的散列表,槽的名称分别为0~10。在插入数据项之前,每个槽的值都是None,表示空槽。散列函数实现从数据项到存储槽名称的转换的,称为散列函数(Hash function)。下面示例中,散列函数接受数据项作为参数,返回整数值0~10,表示数据项存储的槽号。有一种常用的散列原创 2020-07-12 20:46:02 · 3447 阅读 · 0 评论 -
递归(Recursion)及其应用
1. 什么是递归递归是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。递归问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。2. 递归的应用2.1 数列求和数列求和[1,3,5,7,9]换个方式来表达数列求和:全括号表达式(1+(3+(5+(7+(9)))))上面这个式子,最内层的括号(7+9)是无需循环即可计算的,实际上整个求和过程如下:观察上述过程中所包含的重复模式,可以把求和问题归纳成这样:原创 2020-07-06 16:07:21 · 984 阅读 · 0 评论 -
基本数据结构——线性结构(有序表)
1. 什么是有序表(OrderedList)有序表是一种数据项依照其某可比性质(如整数大小、字母表先后)来决定在列表中的位置。越“小”的数据项越靠近列表的头,越靠“前”。2.抽象数据类型有序表(OrderedList)定义的操作3.有序表OrderedList实现在实现有序表的时候,需要记住的是,数据项的相对位置,取决于它们之间的“大小”比较。以整数数据项为例,(17,26,31,54,77,93)的链表形式如下图所示。有序表(OrderedList)同样采用链表方法实现,Node定义相同,原创 2020-07-04 10:26:25 · 3870 阅读 · 0 评论 -
基本数据结构——线性结构(列表/无序表)
1.什么是列表(List)?一个数据项按照相对位置存放的数据集。特别的,被称为“无序表(unordered list)”,其中数据项只按照存放位置来索引,如第1个、第2个…、最后一个等。如一个考试分数的集合“54,26,93,17,77,31”,如果用无序表来表示,就是[54,26,93,17,77,31]2.抽象数据类型:无序表List的操作3.用链表实现无序表为了实现无序表数据结构,可以采用链接表的方案。虽然列表数据结构要求保持数据项的前后相对位置,但这种前后位置的保持,并不要求数据项一原创 2020-07-03 17:41:33 · 1039 阅读 · 0 评论 -
基本数据结构——线性结构(队列、双端队列)
1. 什么是队列?队列是一种有次序的数据集合,其特征是新数据项的添加总发生在一端(通常称为“尾端”),而现存数据项的移除总发生在另一端(通常称为“首front”端)。新加入的数据项必须在数据集末尾等待,而等待时间最长的数据项则是队首。这种次序安排的原则称为先进先出(FIFO:First-in-first-on)队列仅有一个入口和一个出口。不允许数据项直接插入队中,也不允许从中间移除数据项。2.抽象数据类型Queue抽象数据类型Queue是一个有次序的数据集合。数据项仅添加到尾端,而且仅从首端移除原创 2020-07-02 21:31:12 · 597 阅读 · 0 评论 -
基本数据结构——线性结构(栈)
1.什么是线性结构线性结构是一种有序数据项的集合,其中每个数据项都有唯一的前驱和后继(除了第一个没有前驱,最后一个没有后继)。新的数据项加入到数据集中时,只会加入到原有某个数据项之前或之后。具有这种性质的数据集,就称为线性结构。不同线性结构的关键区别在于数据项增减的方式。有的结构只允许数据项从一端添加,而有的机构则允许数据项从两端移除。2.从4个最简单但功能强大的结构入手,开始研究数据结构(栈Stack、队列Queue、双端队列DQeque、列表List)2.1 栈2.1.1 什么是栈?一种有次原创 2020-07-02 15:04:57 · 1184 阅读 · 0 评论 -
python两种内置数据类型(列表list和字典dict)上各个操作的大O数量级
python两种内置数据类型(列表list和字典dict)上各个操作的大O数量级1.对比list和dict操作2.list列表数据类型常用操作性能(1)按索引取值和赋值(v=a[i],a[i]=v)由于列表的随机访问特性,这两个操作执行时间与列表大小无关,均为O(1)(2)列表增长,可以选择append()和“+”list.append(v),执行时间是O(1)lst=lst+[v],执行时间是O(n+k),其中k是被加的列表长度。3.dict字典数据类型常用操作性能字典与列表不同,根原创 2020-07-01 16:54:27 · 405 阅读 · 1 评论 -
“变位词”判断问题及算法复杂度
解法1 逐字检查解法思路:将词1中的字符逐个到词2中检查是否存在,存在就打勾标记(防止重复检查)。如果每个字符都能找到,则两个词是变位词。只要有一个字符找不到,就不是变位词。实现打勾标记:将词2对应字符设为None,由于字符串是不可变类型,需要先复制到列表中。...原创 2020-07-01 15:37:53 · 547 阅读 · 0 评论 -
算法复杂度评价指标(大o表示法)
大O表示法(1)常见的大o数量级函数(2)其他算法复杂度表示法基本操作数量函数T(n)的精确值并不是特别重要,重要的是Tn(n)中起决定性因素的主导部分。用动态的眼光看,就是当问题规模增大的时候,T(n)中的一些部分会盖过其他部分的贡献。数量级函数描述了T(n)中随着n增加而增加速度最快的主导部分,称作“大O”表示法,记做O(f(n)),其中f(n)表示T(n)中的主导部分。(1)常见的大o数量级函数(2)其他算法复杂度表示法...原创 2020-07-01 11:32:12 · 984 阅读 · 0 评论 -
数据结构与算法一(算法与计算复杂度)
算法:一个计算过程,解决问题的方法1. 时间复杂度时间复杂度:用来评估算法运行效率的一个式子(单位)一般来说时间复杂度高的算法比复杂度低的算法慢。常见的时间复杂度(按效率排序):O(1)<O(logn)<O(n)<O(nlogn)<O(n2) <O(n2logn)<O(n^3)复杂问题的时间复杂度:O(n!)、O(2n)、O(nn)…快速判断算法...原创 2019-09-16 19:30:15 · 116 阅读 · 0 评论 -
数据结构与算法三(冒泡排序、选择排序、插入排序)
1. 查找查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程。列表查找(线性表查找):从列表中查找指定元素输入:列表,待查找元素输出:元素下标(未找到元素时一般返回None或-1)内置列表查找函数:index()2. 顺序查找顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,知道找到元素或搜索到列表最后一个元素为止。时间复杂度为O(n)def...原创 2019-09-19 20:18:32 · 120 阅读 · 0 评论 -
数据结构与算法四(快速排序、堆排序、归并排序)
(1)快速排序快速排序:快快速排序思路:取一个元素p(第一个元素),使元素p归位列表被p分成两部分,左边都比p小,右边都比p大递归完成排序#归位函数def partition(li,left,right): tmp=li[left] #将最开始的数字存在temp while left<right: while left<right a...原创 2019-09-23 16:11:22 · 285 阅读 · 0 评论 -
数据结构与算法五(希尔排序、计数排序、桶排序、基数排序)
(1)希尔排序希尔排序(Shell Sort)是一种分组插入排序算法首先取一个整数d1=n/2,将元素分为d1个组,每组相邻量元素之间距离为d1,在各组内进行直接插入排序。取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序。希尔排序的代码实现...原创 2019-09-23 19:51:56 · 216 阅读 · 0 评论 -
数据结构与算法六(查找排序练习)
1.给两个字符串s和t,判断t是否为s的重新排列后组成的单词s=“anagram”,t=“nagaram”,return trues=“rat”,t=“car”,return false2.给定一个m*n的二维列表,查找一个数是否存在。列表有下列特性:(1)每一行的列表从左到右已经排序好。(2)每一行第一个数比上一行最后一个数大。def find(li,val,m,n): f...原创 2019-09-25 21:45:08 · 366 阅读 · 0 评论 -
栈和队列的应用——迷宫问题
给一个二维列表,表示迷宫(0表示通道,1表示围墙)。给出算法,求一条走出迷宫的路径。栈——深度优先搜索(一条路走到黑)也叫回溯法思路:从一个节点开始,任意找下一个能走的点,当找不到能走的点时,退回上一个点寻找是否有前途方向的点。使用栈存储当前路径。maze=[ [1,1,1,1,1,1,1,1,1,1], [1,0,0,1,0,0,0,1,0,1], ...原创 2019-10-05 16:13:07 · 622 阅读 · 0 评论 -
数据结构与算法七(数据结构——列表/数组、栈)
11111原创 2019-10-07 15:58:32 · 200 阅读 · 0 评论 -
数据结构与算法八(数据结构——队列、链表、哈希表)
1. 队列队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除进行插入的一端称为队尾(rear),插入动作称为进队或入队进行删除的一端称为队头(front),删除动作称为出队队列的性质:先进先出(First-in,First-out)队列的实现方式——环形队列环形队列:当队尾指针front==Maxsize-1时,再前进一个位置就自动到0。队首指针前进1...原创 2019-10-08 11:05:58 · 284 阅读 · 0 评论 -
图灵机Turing Machine
图灵机Turing Machine图灵机是1936年,Alan Turing提出的一种抽象计算模型。基本思想是用机器模拟人们用纸笔进行数学运算的过程,但比数值计算更为简单。图灵机的基本概念:在纸上写上或擦除某个符号把注意力从纸的一个位置转向另一个位置在每个阶段,要决定下一步动作依赖于:(a)此人当前所关注的纸上某个位置的符号(b)此人当前思维的状态图灵机由以下几部分构成:(1)一条...原创 2019-09-16 10:58:41 · 827 阅读 · 0 评论