python数据结构与算法
文章平均质量分 72
python数据结构与算法笔记
troublemaker、
零基础的研究生
展开
-
第2章课后习题笔记——数据结构算法 Python语言描述(裘宗燕)
复习下面概念:抽象数据类型:在编程中使用一种对象时,只需考虑应该如何使用,不需要去关注和触及对象的内部表示。这样的数据对象就是一种抽象数据单元,一组这样的对象构成一个抽象的数据类型,为程序的使用提供一套功能。接口:提供模块使用是所需的所有信息。不变类型:如果某个类型只提供了构造操作、解析操作,未提供变动操作,那么该类型的对象在创建后就不会变化,永远处于固定的状态。可变类型:如果摸个类型提供了变动操作,对该类型的对象执行这种操作后,虽然对象依旧,但其内部状态已经改变。self参数:表示当前类。..原创 2021-03-19 15:09:55 · 639 阅读 · 0 评论 -
目录(python数据结构与算法)
目录结构章 节网 址序传送门1. 概念引入传送门2. 顺序表传送门3. 链表传送门4. 栈传送门5. 队列传送门6. 搜索与排序传送门- 6.1 冒泡排序传送门- 6.2 选择排序传送门- 6.3 插入排序传送门- 6.4 快速排序传送门- 6.5 希尔排序传送门- 6.6 归并排序传送门- 6.7 搜索传送门7. 树与树算法传送门-7.1 二叉树传送门-7.原创 2020-08-01 10:25:45 · 127 阅读 · 0 评论 -
序(python数据结构与算法学习)
序我们举一个可能不太恰当的例子:如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器。那么数据结构和算法是什么?答曰:兵法!我们可以不看兵法在战场上肉搏,如此,可能会胜利,可能会失败。即使胜利,可能也会付出巨大的代价。我们写程序亦然:没有看过数据结构和算法,有时面对问题可能会没有任何思路,不知如何下手去解决;大部分时间可能解决了问题,可是对程序运行的效率和开销没有意识,性能低下;有时会借助别人开发的利器暂时解决了问题,可是遇到性能瓶颈的时候,又不知该如何进行针原创 2020-06-02 15:12:36 · 159 阅读 · 0 评论 -
1.概念引入(python数据结构与算法学习)
1.概念引入引入先来看一道题:如果 a+b+c=1000,且 a2a^2a2 + b2b^2b2 = c2c^2c2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?不使用算法尝试# 不考虑算法start_time = time.time()for a in range(1001): for b in range(1001): for c in range(1001): if a+b+c==1000 and a**2+b**2==c**原创 2020-06-02 15:16:06 · 324 阅读 · 0 评论 -
2.顺序表(python数据结构与算法学习)
在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化(可以增加或删除元素)。对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中的某种有意义的信息,或者表示数据之间的某种关系。这样的一组序列元素的组织形式,我们可以将其抽象为线性表。一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。线性表是最基本的数据结构之一,在实际程序中应用非原创 2020-06-02 19:32:44 · 338 阅读 · 0 评论 -
3.链表(python数据结构与算法学习)
为什么需要链表顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。链表的定义链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储区+下个节点链接区)里存放下一个节点的位置信息(即地址)。3.1 单向链表单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个原创 2020-06-04 10:32:26 · 334 阅读 · 0 评论 -
4.栈(python数据结构与算法学习)
栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈结构实现栈可以用顺序表实现,也可以用链表实现。栈的操作Stack()原创 2020-06-06 20:02:57 · 196 阅读 · 0 评论 -
5.队列(python数据结构与算法学习)
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!假设队列是q=(A1,A2,……,An),那么A1就是队头元素,而An是队尾元素。这样我们就可以删除时,总是从A1开始,而插入时,总是在队列最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后。队列的实现同栈一样,队列也可以用顺序表或者原创 2020-06-06 21:43:10 · 185 阅读 · 0 评论 -
6.排序与搜索(python数据结构与算法)
排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法。排序算法的稳定性稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。(4, 1) (3, 1) (3, 7)(5, 6)在这个状况下,有可能产生两原创 2020-07-18 10:08:09 · 139 阅读 · 0 评论 -
6.1.冒泡排序(python数据结构与算法学习)
冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最转载 2020-06-21 16:12:59 · 170 阅读 · 0 评论 -
6.2选择排序(python数据结构与算法)
选择排序 [Selection sort] 是一种简单直观的排序算法。工作原理如下:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择原创 2020-06-21 19:18:52 · 329 阅读 · 0 评论 -
6.3插入排序(python数据结构与算法)
插入排序 Insertion Sort是一种简单直观的排序算法。工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。别和选择排序搞混选择排序是从后面【乱序】的数中拿一个放在前面【已排好序】的最后位置插入排序是从后面【乱序】的数中拿一个放在前面【已排好序】的指定位置实现:# 方法一def insert_sort(alist): """插入排序""原创 2020-06-21 22:06:44 · 148 阅读 · 0 评论 -
6.4快速排序(python数据结构与算法)
快速排序(Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。步骤为:从数列中挑出一个元素,称为"基准"(pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列转载 2020-06-22 10:11:56 · 157 阅读 · 0 评论 -
6.5希尔排序(python数据结构与算法)
希尔排序(英语:Shell Sort):是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。希尔排序过程希尔排序的基本思想:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(分的组数更多了)来进行。最后整个表就只有一列原创 2020-07-11 12:19:52 · 161 阅读 · 0 评论 -
6.6归并排序(python数据结构与算法)
归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组时进行排序。将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。归并排序的分析实现过程:实现:def merge_sort(alist): """归并排序""" n = len(alist) if n <= 1: retur原创 2020-07-11 20:16:35 · 173 阅读 · 0 评论 -
6.7 搜索(python数据结构与算法)
搜索:是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,表示该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找二分法查找(又称折半查找)优点是比较次数少,查找速度快,平均性能好;缺点是要求待查表为有序表,且插入删除困难。综上,二分查找方法适用于不经常变动而查找频繁的有序列表。步骤:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录原创 2020-07-18 10:03:01 · 114 阅读 · 0 评论 -
7.树与树算法(python数据结构与算法)
树的概念树(英语:tree)是一种抽象数据类型(ADT)或是视作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成的一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;如下图中的“中国”每一个非根节点有且只有一个父节点;(可以有多个下级,但只能有一个上级)除了根节点外,每个子节点可以分为多个不相交的子树;比如说:树原创 2020-07-18 10:54:50 · 196 阅读 · 0 评论 -
7.1 二叉树(python数据结构与算法)
二叉树的基本概念二叉树是每个节点最多有两个子树的树结构。通常子树被称作**“左子树”(left subtree)和“右子树”**(right subtree)二叉树的性质(特性)性质1: 在二叉树的第iii层上至多有2i−12^{i-1}2i−1个结点(i>0i>0i>0)性质2: 深度为k的二叉树至多有2k−12^k-12k−1个结点(k>0k>0k>0)性质3: 对于任意一棵二叉树,如果其叶结点数为N0N_0N0,而度数为2的结点总数为N2N_2N2,原创 2020-07-18 22:22:26 · 198 阅读 · 0 评论 -
7.2 二叉树的遍历(python数据结构与算法)
树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。广度优先遍历(层次遍历)从树的根节点开始,从上到下从从左到右遍历整个树的节点python实现 def breath_traval(self): """使用广.原创 2020-07-18 22:40:50 · 200 阅读 · 0 评论