数据结构与算法(python)
文章平均质量分 68
数据结构(Data Structure)是计算机中存储、组织数据的方式。
别呀
学习苦,学习累,所以我不想学习了!
展开
-
数据结构与算法笔记(十七)—— 贪心算法及经典案例(找零问题、背包问题、拼接最大数字问题、活动选择问题)
一、贪心算法贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解。要会判断—个问题能否用贪心算法来计算。二、经典案例2.1、找零问题问题描述: (钱数量最少)假设商店老板需要找零n元钱,钱币的面额有:100元、50元、20元、5元、1元,如何找零使得所需钱币的数量最少?代码实现:t = [100,50,20,5,1] #币值原创 2021-10-18 17:27:43 · 1628 阅读 · 0 评论 -
数据结构与算法笔记(十六)—— 二叉搜索树
一、二叉搜索树定义二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree)。二叉搜索树是具有有以下性质的二叉树:若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值。若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值。左、右子树也分别为二叉搜索树。 二、二叉搜索树的操作2.1、结点创建class Node(object): """节点类""" def __init__(self, elem=-1,原创 2021-09-22 23:01:11 · 189 阅读 · 0 评论 -
数据结构与算法笔记(十五)—— 散列(哈希表)
一、前沿1.1、直接寻址表当关键字的全域U比较小时,直接寻址是一种简单而有效的技术。假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,…,m-1)的关键字,此处m是一个不很大的数。另假设没有两个元素具有相同的关键字。为表示动态集合,我们用一个数组(或称直接寻址表)T[0…m一1],其中每个位置(或称槽)应全域U中的一个关键字。下图说明这个方法;槽 k 指向集合中一个关键字为 k 的元素。如果该集合中没有关键字为 k 的元素,则T[k]=NIL。 用一个直接寻址表T实现动态集原创 2021-09-22 18:23:57 · 310 阅读 · 1 评论 -
数据结构与算法笔记(十四)—— 二叉树
一、二叉树的基本概念二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree) 和“右子树”(right subtree)。二、二叉树的性质(特性)性质 1: 在二叉树的第 i 层上至多有 2^(i-1)个节点(i>0)性质 2: 深度为 k 的二叉树至多有 2^k - 1 个节点(k>0)性质 3: 对于任意一棵二叉树,如果其叶节点数为 N0,而度数为 2 的结点总数为 N2, 则 N0=N2+1;性质 4:具有 n 个节点的完全二叉树的深度必为原创 2021-09-20 23:14:20 · 750 阅读 · 0 评论 -
数据结构与算法笔记(十三)—— 树与树的算法
一、树的概念树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构, 用来模拟具有树状结构性质的数据集合。它是由 n(n>=1)个有限节点组成一个具有层次关 系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树; 二、树的术语节点的度:一个节点含有的子树的个数称原创 2021-09-20 18:44:33 · 228 阅读 · 0 评论 -
数据结构与算法笔记(十二)—— 查找算法(顺序查找、二分法查找)
搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找一、顺序查找最基本的查找技术,过程:从表中的第一个(或最后一个)记录开始,逐个进行记录的 关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录; 如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表示没有查到记 录,查找不成功。1.1、代码实现#从 a 列表中查找值 v,如果找到则返回第一次出现的.原创 2021-09-20 01:14:04 · 744 阅读 · 0 评论 -
数据结构与算法笔记(十一)—— 归并排序
什么是归并排序归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组, 再合并数组。将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数, 谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把 另一个数组的剩余部分复制过来即可。算法步骤申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;设定两个指针,最初位置分别为两个已经排序序列的起始位置;比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移原创 2021-09-20 00:42:16 · 167 阅读 · 0 评论 -
数据结构与算法笔记(十)—— 快速排序
什么是快速排序快速排序(英语:Quicksort),又称为交换排序,通过一趟排序将要排序的数据分割为 独立的两部分。假设要排序的列表是 A[0]……A[N-1],首先任意选取一个数据(通常选用 列表的第一个数)作为基准数据,然后将所有比它小的数都放到它左边,所有比它大的数都 放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算 法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。步骤设置两个变量 low、high,排序开始的时候:low=0,high=N-原创 2021-09-19 19:52:39 · 137 阅读 · 0 评论 -
数据结构与算法笔记(九)—— 希尔排序
什么是希尔排序希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。算法步骤:① 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;② 按增量序列个数 k,对序列进行 k原创 2021-09-16 16:45:14 · 214 阅读 · 0 评论 -
数据结构与算法笔记(八)—— 插入排序
什么是插入排序插入排序(英语: Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。算法步骤:① 将第一排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。② 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则原创 2021-09-16 00:56:27 · 476 阅读 · 0 评论 -
数据结构与算法笔记(七)—— 选择排序
什么是选择排序选择排序(Selection sort)是一种简单直观的排序算法。算法步骤:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法原创 2021-09-15 22:48:30 · 224 阅读 · 0 评论 -
数据结构与算法笔记(六)—— 冒泡排序
什么是冒泡排序冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮”到数列的顶端。冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以原创 2021-09-15 18:41:42 · 149 阅读 · 0 评论 -
数据结构与算法笔记 —— 十大经典排序及算法的稳定性
排序与搜索排序算法(英语: Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法。排序算法的稳定性稳定性︰稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。(4,1) (3,1) (3,7) (5,6)在这个状况下,有可能产原创 2021-09-15 18:27:56 · 1851 阅读 · 0 评论 -
数据结构与算法笔记(五)——队列(FIFO队列、双端队列)
一、FIFO队列1.1、概念队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的(First In First Out)的线性表,简称FIFO。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!假设队列是q= (a1,a2,…,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,总是在队列最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后。1.2、队原创 2021-09-15 13:38:45 · 8288 阅读 · 0 评论 -
数据结构与算法笔记(四)—— 栈
一、栈的概念栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语: top)进行加入数据(英语: push)和输出数据(英语: pop)的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。 二、栈结构实现栈可以用顺序表实现,也可以用链表实现。原创 2021-09-15 11:05:12 · 114 阅读 · 0 评论 -
数据结构与算法笔记(三)—— 链表(单链表、循环链表、双向链表)
一、前沿1.1、为什么需要链表顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。1.2、链表定义链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。 二 、单向链表单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(原创 2021-09-15 01:14:20 · 5409 阅读 · 0 评论 -
数据结构与算法笔记(二)—— 顺序表
一、顺序表的形式在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化(可以增加或删除元素)。对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中的某种有意义的信息,或者表示数据之间的某种关系。这样的一组序列元素的组织形式,我们可以将其抽象为线性表。一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。线性表是最基本的数据结构之一,原创 2021-09-14 00:02:01 · 216 阅读 · 0 评论 -
数据结构与算法笔记(一)—— 引入概念、时间复杂度
一、前沿我们为什么要学习数据结构和算法?我们举一个可能不太恰当的例子:如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器。那么数据结构和算法是什么? 答曰:兵法!我们可以不看兵法在战场上肉搏,如此,可能会胜利,可能会失败。即使胜利,可能也会付出巨大的代价。我们写程序亦然:没有看过数据结构和算法,有时面对问题可能会没有任何思路,不知如何下手去解决;大部分时间可能解决了问题,可是对程序运行的效率和开销没有意识,性能低下;有时会借助别人开发的利器暂时解决了问题,原创 2021-09-13 01:02:29 · 216 阅读 · 0 评论