算法与数据结构

数据结构与算法之二叉搜索树

纵饮孤独 提交于 2020-02-06 05:09:33
二叉搜索树 二叉搜索树又称为二叉排序树,首先二叉搜索树是一棵二叉树,所谓二叉树,就是"任意节点最多允许两个子节点",这两个子节点称为左右子节点。 性质: 若左子树非空,则左子树上的所有节点均小于其根节点 若右子树非空,则右子树上的所有节点均大于其根节点 即任意节点的值一定大于其左子树中的每一个节点的值,并小于右子树中的每一个节点的值。换句话说, 中序遍历二叉搜索树得到的序列为从小到大排序的有序序列。 二叉搜索树基本实现: //二叉搜索树的实现 #include<iostream> using namespace std; struct Node{ int data;//数据 struct Node *lchild;//左孩子结点 struct Node *rchild;//右孩子结点 Node(int x):data(x),lchild(nullptr),rchild(nullptr){}; }; //从二叉树中搜索对应的val值,如果存在在返回该结点,若不存在则返回空指针 Node* SearchBST(Node* root,int val) { while(root!=nullptr) { if(root->data == val) return root; root = root->data > val?root->lchild:root->rchild; } return

【Python数据结构与算法复习day40】1-04常见时间复杂度与大小关系常见时间复杂度之间的关系+常见时间复杂度之间的关系(必背)+n的阶层的时间复杂度比n的n次方的时间复杂度低

眉间皱痕 提交于 2020-02-06 04:16:24
1-04常见时间复杂度与大小关系 文章目录 1-04常见时间复杂度与大小关系 常见的时间复杂度 常见时间复杂度之间的关系 练习: 时间复杂度练习( 参考算法的效率规则判断 ) 解答 常见的时间复杂度 注意,经常将log2n(以 2 为底的对数)简写成logn 常见时间复杂度之间的关系 所消耗的时间从小到大:【必背!!!!!!】 练习: 时间复杂度练习( 参考算法的效率规则判断 ) O(5) O(2n + 1) O(n²+ n + 1) O(3n³+1) 解答 O(5)=O(1) O(2n + 1)=O(n) O(n²+ n + 1)=O(n²) O(3n³+1)=O(n³) 所以 O(5)<O(2n + 1)<O(n²+ n + 1)<O(3n³+1) 来源: CSDN 作者: 汪雯琦 链接: https://blog.csdn.net/qq_35456045/article/details/104185928

数据结构与算法概念

扶醉桌前 提交于 2020-02-06 00:27:49
数据结构小白入门 数据结构指一组相互之间存在一种或多种特定关系的数据元素的集合, 当我们需要在计算机中存储这些数据时,还涉及到数据的,组织方式,在计算机中的存储方式,以及定义在该数据上的一组操作; 一组数据相互之间有某种关系 组织方式 存储方式 以及可对其进行的一组操作 理解: 我们学习的最终目的是要在计算机中存储 一组数据 ,但是不得不先考虑数据的 组织方式 ,在计算机中的 存储方式 ,以及可以对这些数据进行的 一组操作 ,当然了既然是一组数据必然表明了这写数据之间是存在想换的关联关系的;关系可能还会有多种; 例如: 一组数据:12345 组织方式:从小到大 存储方式:可使用线性存储结构 操作:要取出最大的一个 数据结构研究方向 问题: 机外处理 处理要求 建模: 逻辑结构 基本运算 实现: 存储结构 算法 基本术语 数据(Data): ​ 所有能被计算机处理的符号的集合 数据元素(DataElement): ​ 是数据集合中的一个 个体,即数据的基本单位 数据项(DataItem): ​ 数据元素常常可分为若干个数据项,数据项是数据具有意义的最小单位 组织数据的三个层次: 数据(表)->数据元素(行)->数据项(字段) 实际问题中的数据成为原始数据 逻辑结构(LogicalStructure) ​ 数据元素之间的结构关系,如从小到大/一对一/一对多 物理结构

【数据结构】---线性表

℡╲_俬逩灬. 提交于 2020-02-05 19:57:44
目录 线性表的定义和特点 线性表的顺序表示和实现 线性表的顺序存储表示 顺序表中基本操作的实现 1. 初始化 2. 取值 3. 查找 4. 插入 5. 删除 线性表的定义和特点 线性表属于线性结构。 线性结构的基本特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,其他每个元素都有一个前驱和后继。 同一线性表中的元素必定具有相同的特性,即属于同一数据对象,相邻数据元素之间存在着序偶关系。 由 \(n (n \geq 0)\) 个数据特性相同的元素构成的有限序列称为 线性表 。线性表中元素的个数 \(n (n \geq 0)\) 定义为线性表的长度, \(n = 0\) 时称为空表。 线性表的顺序表示和实现 线性表的顺序存储表示 线性表的顺序表示是指用一组地址连续的存储单元一次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构,称这种存储结构的线性表为**顺序表 (Sequential List)。逻辑上相邻的元素,物理次序也是相邻的。 线性表的第一个数据元素的存储位置,通常称作线性表的起始位置或 基地址 。线性表的顺序存储结构是一种 随机存取 的存储结构。 通常使用数组来描述数据结构中的顺序存储结构,由于线性表的长度可变,在C语言中可用动态分配的一维数组表示线性表,描述如下: // ----------顺序表的存储结构---------- #define MAXSIZE

【Python数据结构与算法复习day37】1-01-算法引入+“如果 a+b+c=1000,且 a^2 + b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?不允许依赖任何”

元气小坏坏 提交于 2020-02-05 19:11:00
Python数据结构与算法 1-01-算法引入 文章目录 Python数据结构与算法 1-01-算法引入 为什么要学习数据结构与算法? 面试题 解答 枚举法 思路 代码实现 结果 记录时间的代码实现 说明 算法的定义 推荐图书 算法的五大特性 为什么要学习数据结构与算法? 因为算法即兵法,是基本功,要不断地主动学习与积累 面试题 如果 a+b+c = 1000,且 a^2 + b^2 = c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?不允许依赖任何数学公式 解答 不依靠数学公式,我们靠枚举法 枚举法 思路 a=0 b=0 c=0 a=0 b=0 c=1 a=0 b=0 c=2 a=0 b=0 c=0~1000 a=0 b=1 c=0~1000 这样手工也可以解答出 如果题目改成 如果 a+b+c = 2000,且 a^2 + b^2 = c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?不允许依赖任何数学公式 这样的枚举法也是基于实现的 以上就是一个枚举法的思路 程序怎么来写呢 代码实现 # 如果 a+b+c=1000,且 a^2 + b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?不允许依赖任何数学公式 # a # b # c for a in range ( 0 , 1001 ) : for b in range (

学习数据结构:二叉树

风格不统一 提交于 2020-02-05 09:30:54
二叉树的定义 二叉树,是树的一种特殊结构。其特点是: ①每个结点最多有两棵子树,不存在度大于2的结点。 ②左子树和右子树是由次序的,不能颠倒。 特殊二叉树 1、斜树 所有结点都只有左子树的二叉树叫左斜树,同理结点只有右子树的叫右斜树。每一次只有一个结点,结点的个数与二叉树的深度相同。下面两个结构分别为左斜树和右斜树。 2、满二叉树 在一棵二叉树中,如果所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层,这样的二叉树称为满二叉树。 结合定义可得到三个结论: ①叶子结点出现在同一层。 ②非叶子结点的度一定是2. ③同样深度的二叉树中,满二叉树的结点数最多,叶子结点树最多。 如下图所示为一颗满二叉树。 完全二叉树 对一棵有n个结点的二叉树按序号从小到大开始排序,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点位置完全相同,则这棵二叉树称为完全二叉树。通俗的话说,就是这棵二叉树中间没有空缺。下图就是一颗完全二叉树。 下面的树就不是一颗完全二叉树, 结合定义可以得出结论: ①叶子结点只能出现在最下面两层。 ②最下的叶子一定集中在左部的连续位置,中间不能有空挡。 ③倒数第二层有叶子结点,那么一定在右边连续位置。 ④如果结点度为1,则该结点只有左孩子,不会存在右子树。 二叉树的性质 性质① 在二叉树的第i层上最多只有2^(i-1)个结点(i>=1)。

「Do.028」数据结构与算法——入门(一)

走远了吗. 提交于 2020-02-05 09:04:25
「Do.028」数据结构与算法——入门(一) 首发公众号: Android程序员日记 作者: 贤榆的榆 如果喜欢,请 关注、赞赏、点在看 阅读时间:1362字 4分钟 前言 先说说为什么想要写数据结构与算法这个系列文章,主要出于两方面考虑: 第一个是面试的需要,大厂和外企尤大多数都会问到关于算法和数据结构方面的问题,而每次都考背,那其实也很难形成长期记忆,也不能与面试官进一步深入探究。 其二就是工作的需要了,作为一个初级的程序员用ArrayList和HashMap可能就几乎可以解决大部分问题了,因为我们的App用户量不算大,业务逻辑不算复杂,所以浪费一点性能和手机资源也不会有太大的问题暴露出来,但是当App变得越来越大,业务逻辑也越来越复杂时,我们就需要去考虑用在某些场景下LinkedList是不是会更好,TreeMap会不会比HashMap的使用成本更低?我知道很多同学会马上说出他们之间两两的区别。但如果不知道其背后的实现原理和逻辑,还真的不太可能会考虑到使用别的去代替一个我们常用的。 数据结构入门 针对自己自学《数据结构导论》这门课程,真的是有一种感触就是——出来混的总是要还的。高中玩过去了,混过去了,现在招聘市场上也会对本科学历有要求,像我这种正在专升本的,其实以后可能也是没什么用了。因为人家可能会写明需要统招本科。那为什么我还想要自考去拿一个计算机的本科学历

线性数据结构算法

拟墨画扇 提交于 2020-02-04 14:28:45
数据 结构 是 计算机 存储、组织 数据 的方式。数据结构是指相互之间存在一种或多种特定关系的 数据元素 的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储 效率 。数据结构往往同高效的检索 算法 和 索引 技术有关。 图形结构 树形结构 线性结构 集合结构 1.冒泡排序 在进行冒泡法排序(升序)时,将第一个数与后继的数进行比较,如果顺序则继续第二个数与后继的数进行比较;如果逆序则交换位置,继续和后继的数进行比较,完成第一趟冒泡排序。同理,直到数组有序。 如果经过一趟冒泡排序不发生数据交换说明数组原本有序。 最好时间复杂度:O(n) 平均时间复杂度:O(n^2) 最坏时间复杂度: O(n^2) 空间复杂度: O(1) 代码示例 /** * 冒泡排序 * * @param array * @return 相邻数据对比,交互位置 */ public static int[] bubblingSort(int[] array) { //从后一位开始循环对比,直到循环完。 for (int i = array.length - 1; i > 0; i--) { boolean flag = true; //把最大的筛选到最后 for (int j = 0; j < array.length - 1; j++) { if (array[j] > array[j + 1]) {

数据结构与算法——Day01

纵饮孤独 提交于 2020-02-04 05:46:53
数据结构与算法——Day01 1:数组 1.1 什么是数组 数组本质上就是一组数的集合 1.2 数组的定义 在内存中开辟 连续 的存储空间,存贮 相同类型数据 的 有序 集合 1.2.1基础定义: 连续:在内存中连续分配的,有序的 相同数据类型:数组中存储的数据都是相同数据类型的 有序:数组存储时内存有序,存在一个连续的索引,索引从0开始 1.3 数组的特点 数组的长度不能修改 查询,修改效率高 迭代元素效率高 添加删除效率低 1.4 数组的使用场景 ​ 对于数据进行查询,但是不会频次较高的添加或者删除动作。 1.5 问题 数组的索引为什么是从0开始的 因为从0开始可以通过简单的计算快速定位到元素的地址值 数组中元素的地址值=首元素的地址+(索引*元素的宽度) 结论:数组能够快速的通过索引定位到元素。一旦从数组中对于元素进行各项操作,如果知道当前元素的索引就能够款苏进行操作 为什么说数组的长度一旦指定不能修改 数组开辟的是内存中连续的存储空间 ,导致如果从出现长度可以修改是特别小号内存资源的,很多时可能出现内存够用,但实质的连续内存空间不够用导致内存溢出问题。 来源: CSDN 作者: 三木成森. 链接: https://blog.csdn.net/Asdzxc968/article/details/104161050

数据结构与算法—稀疏数组和队列

白昼怎懂夜的黑 提交于 2020-02-04 04:13:17
目录 1.稀疏数组 1.1 解决方法 1.2 代码实现 2. 队列 2.1 数组模拟队列 2.2 数组模拟环形队列 1.稀疏数组 所谓稀疏数组就是当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以使用稀疏数组去压缩数据。OK,如果你不明白,那我们来看一个例子。 在一个五子棋中,有存盘和续上盘的功能 分析问题:因为该二维数组的很多默认值是 0,因此记录了很多没有意义的数据 > 稀疏数组 1.1 解决方法 思路 记录数组 一共有几行几列,有多少个不同 的值 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的范围 应用实例 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等) 把稀疏数组存盘,并且可以从新恢复为原来的二维数组 整体思路 1.2 代码实现 public class SparseArray { public static void main(String[] args) { //创建一个二维数组 //0:表示没有棋子 1表示黑子 2表示蓝子 int chessArr[][] = new int[11][10]; chessArr[1][2] = 1; chessArr[2][3] = 2; for(int[] row:chessArr){ for