算法与数据结构

算法与数据结构基础 - 递归(Recursion)

久未见 提交于 2019-11-29 21:34:01
递归基础 递归(Recursion)是常见常用的算法,是DFS、分治法、回溯、二叉树遍历等方法的基础,典型的应用递归的问题有求阶乘、汉诺塔、斐波那契数列等, 可视化过程 。 应用递归算法一般分三步,一是定义基础条件(base case),二是改变状态、向基础条件转移,三是递归地调用自身。例如 LeetCode题目 1137. N-th Tribonacci Number: // 1137. N-th Tribonacci Numberprivate: vector<int> nums={0,1,1}; //基础条件 int maxN=2; public: int tribonacci(int n) { if(n<=maxN) return nums[n%3]; //改变状态、递归地调用自身 nums[n%3]=tribonacci(n-3)+tribonacci(n-2)+tribonacci(n-1); maxN=n; return nums[n%3]; } 相关LeetCode题: 1137. N-th Tribonacci Number 题解 938. Range Sum of BST 题解 779. K-th Symbol in Grammar 题解 894. All Possible Full Binary Trees 题解 776. Split BST 题解 247.

python实现基础的数据结构(二)

非 Y 不嫁゛ 提交于 2019-11-29 18:33:55
本文涉及到的代码均已放置在我的github中 --> 链接 python实现基础的数据结构(一) python实现基础的数据结构(二) python实现基础的数据结构(三) python语法较为简洁,正好最近在复习数据结构,索性就用python去实现吧😀 本文实现的有线性表、栈、队列、串、二叉树、图、排序算法。参照教材为 数据结构(C语言版)清华大学出版社 ,还有网上的一些大神的见解。由于包含代码在内,所以内容很多,分了几篇,话不多说,我们直接步入正题🙈 注:本文实验环境:Anaconda 集成 python 3.6.5 ( 故代码为 python3 ) 由于本文代码过多,故每一步不做太详细的介绍,我尽量在代码中解释细节,望体谅 串 串是由零个或者多个字符组成的优先序列,一般记为是s = ‘a1a2…an’ ,python对字符串的操作已经比较成熟和简单,所以我们这里着重介绍串的模式匹配算法,这就不得不提KMP匹配算法,这种算法和正则表达式有类似之处,一个用了DFA的思想,一个用了NFA的思想。 KMP算法的思想是,当匹配失败时,可以利用已经知晓的一部分文本内容,避免从头开始重新匹配。这个匹配的过程可以使用有限状态自动机(DFA)。可以看看 这位大神 的描述。 每当一趟匹配过程中出现字符比较不等时,不需要回溯I指针,而是利用已经的带的“部分匹配

算法与数据结构(11): 线性表(2)——链表

别等时光非礼了梦想. 提交于 2019-11-29 16:38:57
文章目录 3 链表的基本操作 3.1 链表简介 3.2 代码示例 4 链表应用——通讯录 参考资料 注:转载请标明原文出处链接: https://xiongyiming.blog.csdn.net/article/details/100855604 3 链表的基本操作 3.1 链表简介 链表 是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表 由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的 数据域 ,另一个是存储下一个结点地址的 指针域 。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。 (以上均来自百度百科) 顺序表优点 :遍历和寻址非常快 顺序表缺点 :往顺序表中插入一个元素,顺序表中的元素都要往后移动;顺序表中删除一个元素, 顺序表中的元素都要往前移动。这样的效率很低。 因此,针对顺序表的缺点,引出 链表 。 3.2 代码示例 要求 线性表——单链表 List();//创建线性表——构造函数 ~List(); //销毁线性表——析构函数 void

数据结构与算法之排序详解 一点课堂(多岸学院)

时光毁灭记忆、已成空白 提交于 2019-11-29 15:20:18
通过前面的知识,我们已经知道,有序的数据在查找时有极大的性能提升。很多查找都基于有序数据,但并不是所有的结构都能像二叉排序树一样,在插入数据时就已经排好序,很多时候往往是无序的数据,需要我们使用时再进行排序,这就意味着我们需要寻找高效率的排序算法。接下来,我们对当下使用较为普遍的几个算法逐一进行分析。这里推荐一个可以查看算法运行动态过程的网站,加深对算法原理的理解。 基础知识 排序定义 假设含有n个记录的序列为{r1. r2, ..., rn},其相应的关键字分别为{k1, k2, ..., kn},需确定1, 2, ..., n的一种排列p1, p2, ..., pn,使其相应的关键字满足kp1≤kp2≤...≤kpn(非递减或非递增) 关系,即使得序列成为一个按关键字有序的序列{rp1, rp2, ..., rpn} , 这样的操作就称为排序。 稳定性 假设ki=kj( 1≤i≤n, 1≤j≤ n, i≠j ) ,且在排序前的序列中 ri 领先于 rj (即i<j) 。如果排序后 ri 仍领先于 rj,则称所用的排序方法是稳定的;反之,若可能使得排序后的序列中 rj 领先 ri,则称所用的排序方法是不稳定的。 简单来说,就是对于原数据中相等的数据,排序前后如果相对位置没有改变,就是稳定的。 内排序与外排序 内排序是在排序整个过程中,待排序的所有记录全部被放置在内存中

算法与数据结构

一世执手 提交于 2019-11-29 10:24:16
1、线性表实现 2、栈的实现 3、队列的实现 4、二叉树的前中后序层序遍历的实现(结构体数组存储 递归实现) 5、二叉树的前中后序层序遍历的实现(链式存储 递归实现) 6、二叉树的前中后序遍历的实现(链式存储 非递归实现) 7、二叉树插入删除查找递归及非递归的实现 8、二叉树前中序变后序(高级方法) 9、二叉树的表达(打印各个节点的详细信息) 10、平衡二叉树的建立与调节(AVL树) 11、堆的初始化,创建,插入,删除以及乱序输入的调整 12、哈夫曼树的创建 13、图的邻接矩阵表示法 14、图的邻接表表示法 15、插入排序、选择排序、冒泡排序、希尔排序 来源: https://blog.csdn.net/qq_43590403/article/details/100783553

十分钟弄懂:数据结构与算法之美 - 时间和空间复杂度

两盒软妹~` 提交于 2019-11-29 07:49:55
复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半了。 1. 什么是复杂度分析 ? 数据结构和算法解决是 “如何让计算机更快时间、更省空间的解决问题”。 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。 2. 为什么要进行复杂度分析 ? 和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点。 掌握复杂度分析,将能编写出性能更优的代码,有利于降低系统开发和维护成本。 3. 如何进行复杂度分析 ? 3.1 大 O 表示法 算法的执行时间与每行代码的执行次数成正比,用 T(n) = O(f(n)) 表示,其中 T(n) 表示算法执行总时间,f(n) 表示每行代码执行总次数,而 n 往往表示数据的规模。这就是大 O 时间复杂度表示法。 3.2 时间复杂度 1)定义 算法的时间复杂度,也就是算法的时间量度。 大 O 时间复杂度表示法 实际上并不具体表示代码真正的执行时间,而是表示 代码执行时间随数据规模增长的变化趋势 ,所以也叫 渐进时间复杂度 ,简称 时间复杂度 (asymptotic time complexity)。 例子1: function aFun() {

20王道——数据结构——绪论

落花浮王杯 提交于 2019-11-29 06:32:58
1.1数据结构的基本概念 1.可以用(抽象数据类型)定义一个完整的数据结构 2.以下数据结构中,(树)是非线性数据结构 3.以下属于逻辑结构的是(有序表) 4.以下与数据的存储结构无关的是(栈) 5.以下关于数据结构的说法正确的是(数据的逻辑结构独立于其存储结构) 6.在存储数据时,通常不仅要存储各数据元素的值,而且要存储(数据元素之间的关系) 7.链式存储设计时,结点内的存储单元地址(一定连续)。 1.2算法和算法评价 1.一个算法应该是(问题求解步骤的描述) 2.若某算法的时间复杂度为O(n^2),表明该算法(执行时间与n^2成正比) 3.以下算法的时间复杂度为(O(log2(n))) void func(int n){ int i=1; while(i<=n) i=i*2; } 求算法时间复杂度步骤: 基本语句是……,共执行了……次,故T(n)=O(……)。 来源: https://blog.csdn.net/yqajsj/article/details/100539648

JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序

£可爱£侵袭症+ 提交于 2019-11-29 05:59:46
1. 前言 算法为王。 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远 。 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。 之所以把 计数排序、桶排序、基数排序 放在一起比较,是因为它们的平均时间复杂度都为 O(n) 。 因为这三个排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作 线性排序 (Linear sort)。 之所以能做到线性的时间复杂度,主要原因是,这三个算法不是基于比较的排序算法,都不涉及元素之间的比较操作。 另外,请大家带着问题来阅读下文,问题:如何根据年龄给 100 万用户排序 ? 2. 桶排序(Bucket Sort) 桶排序是计数排序的升级版,也采用了 分治思想 。 思想 将要排序的数据分到有限数量的几个有序的桶里。 每个桶里的数据再单独进行排序(一般用插入排序或者快速排序)。 桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 比如: 桶排序利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 为了使桶排序更加高效,我们需要做到这两点: 在额外空间充足的情况下,尽量增大桶的数量。 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中。 桶排序的核心:就在于怎么把元素平均分配到每个桶里

6 索引的实现原理

半世苍凉 提交于 2019-11-29 05:40:51
索引的实现原理 索引底层采用的是 B-Tree,折半查询,二分查找 如果不使用索引,查询时会进行全表扫描(我们应该减少全表扫描)。 使用索引,会生成索引文件,如果有 1-11 的id的数据,会先判断与6相比(6是中间数据),之后再进行二分查找… 查找 11 次 就能找到 2 的 10 次方的数据 1024 个,查找 31 次 就能找到 2 的 30 次方的数据。 数据库索引 ,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B 树及其变种 B+ 树 。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 为表设置索引要付出代价 : 一是增加了数据库的存储空间, 二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。 来源: https://blog.csdn.net/weixin_42112635/article/details/100532033

数据结构之绪论

旧街凉风 提交于 2019-11-29 05:03:32
基本概念 数据: 数据 是对客观事物的符号表示,在计算机科学中指所有能输入到计算机中并被计算机程序处理的符号的总称。数据的含义很广泛,如图像、声音等都可以通过编码而归之为数据的范畴。 数据元素:(行)(元组)(记录) 数据元素 是数据的 基本单位 ,在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素可包含多个数据项。 数据项 是数据的不可分割的 最小单位 。如把一本书看成一个数据元素,则可把书名、作者名,看成这个数据元素包含的两个数据项。 数据对象:(表) 数据对象是性质相同的数据元素的集合,是数据的一个子集。如整形数据对象是集合 N={0,+-1,+-2......}。 数据类型: 原子类型: 其值不可再分的数据类型。如整形、字符型、枚举类型、空类型。 结构类型: 其值可以再分解为若干成分(分量)的数据类型。 抽象数据类型: 抽象数据组织及与之相关的操作。 抽象数据类型:(Abstract Data Type) 抽象数据类型(ADT) 是指一个数学模型及定义在该模型上的一组操作, 仅取决于 它的一组逻辑特性。通常用 (数据对象、数据关系、基本操作集) 这样的三元组来表示抽象数据类型。 数据结构:(数据结构=数据元素+数据关系) 数据结构 是相互之间存在一种或多种特定关系的数据元素的集合。数据元素不是孤立存在的,数据元素相互之间的关系称为 结构 。包括三个方面的内容