数据结构

做了几年程序员,某天居然发现自己没学过数据结构。。。

孤街浪徒 提交于 2020-02-26 21:52:17
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 简介 学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 根据百度百科的介绍,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 听听这是人话么,我帮你们翻译一下,其实数据结构就是用来描述计算机里存储数据的一种数学模型,因为计算机里要存储很多乱七八糟的数据,所以也需要不同的数据结构来描述。 本文思维导图 为什么要学数据结构 了解了基本概念之后,接下来我们再来看看,为什么我们要学习数据结构呢? 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。 许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。 也就是说,选定数据结构往往是解决问题的核心,比如我们做一道算法题

数据结构与算法初步认识

不羁岁月 提交于 2020-02-26 21:44:23
文章来源: http://blog.seclibs.com/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E5%88%9D%E6%AD%A5%E8%AE%A4%E8%AF%86-2/ 什么是数据结构和算法 数据结构和算法经常是结合在一起的东西,数据结构是数据的存储方式,而算法是对数据的具体操作,他们二者是相辅相成的,数据结构是为算法服务的,算法是要作用在特定的数据结构之上的,两者是不可以孤立存在的。 在平时我们所遇到的数据结构和算法有以下一些 整个列表的内容下来还是非常多的,这里不立什么flag,只是为了给之后所学习的内容做一个更好的铺垫。 数据结构和算法的应用就是为了解决程序的快和省的问题,即运行的够快,占用的空间够少,在评比这两项内容的时候,我们引入了时间复杂度和空间复杂度两个复杂度的概念。虽然说我们可以在写完程序后对程序的时间进行计算和统计等,但那属于事后统计法,有一种事后诸葛亮的感觉,我们需要的是在写程序的时候就对整体的复杂性有一个大概的评估。 这里我们引入的是大O表示法,T(n)=O(f(n)),其中,T(n) 表示代码执行的时间;n 表示数据规模的大小;f(n) 表示每行代码执行的次数总和。因为这是一个公式,所以用 f(n) 来表示。公式中的 O,表示代码的执行时间 T(n) 与 f(n)

数据结构-图和图遍历(DFS、BFS)

ⅰ亾dé卋堺 提交于 2020-02-26 20:13:45
一、图的定义和相关术语 图是由顶点(Vertex)和边(Edge) 图可以分为有向图和无向图,无向图所有边都是双边的 顶点的度是指该顶点相连的边的条数,特别是对于有向图的边数称为顶点的出度,顶点的入边条数称为该顶点的入度。 顶点和边都可以有一定的属性,量化的属性称为权值,顶点的权值和边的权值分别称为点权和边权。 二、图的存储 一般图来说存储方式有两种: 邻接矩阵 和 邻接表 邻接矩阵 ,本质上是一个二维数组,里面可以存放权值,但是是开辟了一个二维数组,不能够开辟很大的,一般的结点数不能超过 1000 。 邻接表 , N个顶点就会有N个列表,常常使用vector来实现邻接表。 vector<int> Adj[N]; Adj[1].push_back(3); struct Node{ int v; int w; }; vector<Node> Adj[N]; //如果想添加边 Node temp; temp.v = 3; temp.w = 4; Adj[1].push_back(temp); //更快的方式,用定义结构体Node时构造函数 struct Node{ int v, w; Node(int _v, int _w) : v(_v), w(_w) {} } //这样就可以不用定义临时变量 Adj[1].push_back(Node(3, 4)); 三、图的遍历

数据结构之栈

爱⌒轻易说出口 提交于 2020-02-26 20:10:46
1、栈Stack,栈也是一种线性结构,相比数组,栈对应的操作是数组的子集。栈只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶。栈是一种先进后出的或者后进先出的数据结构,也称为Last In First Out(LIFO)。 2、封装的数组的代码,可以实现增加,修改,删除,查询,动态扩容,缩容,判断是否为空等等方法。 1 package com.company; 2 3 4 /** 5 * 6 */ 7 public class Array<E> { 8 9 private E[] data;//定义数组 10 private int size;//数组实际的长度 11 12 /** 13 * 构造函数,传入数组的容量capacity构造Array 14 * 15 * @param capacity 初始化数据的容量长度 16 */ 17 public Array(int capacity) { 18 // 使用泛型,可以创建任意类型的数组类型 19 data = (E[]) new Object[capacity]; 20 // 初始化数组的实际内容的长度为0 21 size = 0; 22 } 23 24 /** 25 * 无参数的构造函数,默认数组的容量capacity=10 26 */ 27 public Array() { 28 // 无参构造函数

数据结构与算法(树)

巧了我就是萌 提交于 2020-02-26 19:13:10
树的定义 树(Tree)是n(n>=0)个结点的有限集。当n=0时成为空树,在任意一棵非空树中: 1 有且仅有一个特定的称为根(Root)的结点; 2 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、.Tm,其中每一个集合本身又是棵树,并且称为根的子树( Subtree) 注意: n>时,根结点是唯一的,坚决不可能存在多个根结点 m>θ肘,子树的个数是没有限制的,但它们互相是定不会相交的。 结点 结点分类 图片中,每一个圈圈我们就称为树的一个结点。结点拥有的子树数称为结点的度 ( Degree),树的度取树内各结点的度的最大值。 度为0的结点称为叶结点(Leaf)或终端结点; 度不为θ的结点称为分支结点或非终端结点,除根结点外,分支结点也称为内部结点。 结点间的关系 结点的子树的根称为结点的孩子(Child),相应的,该结点称为孩子的双亲( Parent),同一双亲的孩子之间互称为兄弟(Sibling)。 结点的祖先是从根到该结点所经分支上的所有结点。 结点的层次 结点的层次(Level)从根开始定一起,根为第一层,根的孩子为第二层。 其双亲在同一层的结点互为堂兄弟。 树中结点的最大层次称为树的深度( Depth)或高度。 其他概念 如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。 森林( Forest)是m(m>=0

字典数据结构

杀马特。学长 韩版系。学妹 提交于 2020-02-26 17:34:38
一. 认识字典 字典的介绍 生活中的字典 中文字典我们可以根据拼音去查找汉字, 并且找到汉字对应的词以及解释. 英文字典也是类似, 根据英文字母找到对应的单词, 再查看其翻译和应用场景. 很多编程语言中都有字典的概念 字典有什么特点呢? 字典的主要特点是一一对应的关系. 比如保存一个人的信息, 在合适的情况下取出这些信息. 使用数组的方式: [18, "Coderwhy", 1.88]. 可以通过下标值取出信息. 使用字典的方式: {"age" : 18, "name" : "Coderwhy", "height": 1.88}. 可以通过key取出value 字典的映射关系: 有些编程语言中称这种映射关系为字典, 因为它确实和生活中的字典比较相似. (比如Swift中Dictionary, Python中的dict) 有些编程语言中称这种映射关系为Map, 注意Map在这里不要翻译成地图, 而是翻译成映射. (比如Java中就有HashMap&TreeMap等) 字典和数组: 字典和数组对比的话, 字典可以非常方便的通过key来搜索对应的value, key可以包含特殊含义, 也更容易被人们记住. 字典和对象: 很多编程语言(比如Java)中对字典和对象区分比较明显, 对象通常是一种在编译期就确定下来的结构, 不可以动态的添加或者删除属性.

数据结构--绪论

故事扮演 提交于 2020-02-26 16:38:10
数组求和的迭代和递归求法 迭代版本 int SUMI(int A[], int n) { int sum = 0; //O(1) for (int i = 0;i < n;i++) { //n sum += A[i]; // O(1) } return sum; // O(1) } 递归版本 int SUM2(int A[], int n) { //线性递归,采取递归跟踪的策略 return //也可以采取递归方程 (n < 1) ? 0 : SUM2(int A[], int n - 1) + A[n - 1]; } //T( ) = O(1) * (N+1) = O(n) 数组倒置递归版本 void reverse(int* A, int lo, int hi) { //数组倒置递归版本 if (lo < hi) { swap(A[lo], A[hi]); return reverse( A, int lo + 1, int hi - 1); } else return; // 这个就是递归基啊,lo >= hi 都不行的。 } 分而治之版数组求和 int SUM(int A[], int lo, int hi) { //分治版数组求和 if (lo == hi)return A[lo]; int mid = (lo + hi) >> 1; return SUM(A, lo,

数据结构:小结(红黑树)

社会主义新天地 提交于 2020-02-26 15:35:30
1、栈: 先进后出 2、队列: 先进先出 3、数组: 查询快 :数组地址连续,可通过数组的首地址找到数组,通过数组的索引查找某一个元素 增删慢 :数组长度固定,要增加或删除一个元素必须新创建一个数组,将原数组数据复制过来 4、链表: 链表中的每一个元素称为一个节点,一个节点包含了一个数据源(存储数组),两个指针域(存储自己的地址,存储下一个节点的地址) 查询慢 :链表中地址不连续。每次查询元素,都必须从头开始查询 增删快 :链表结构增加或删除一个元素,对整体结构没有影响 单向链表 :链表中只有一条链子,不能保证元素的顺序(存储元素和取出元素的顺序可能不一致) 双线链表 :链表中有两条链子,有一条链子是专门记录元素的顺序,是一个有序的集合。 5、红黑树 二叉树 :分支不超过两个:左孩子也叫左子树,右孩子也叫右子树 排序树(查找树) :在二叉树的基础上,元素有大小顺序,左子树小,右子树大 平衡树 :左孩子数量 = 右孩子数量 平衡树 :左孩子数量不等于右孩子数量 红黑树 特点 :趋近于平衡树,查询叶子节点最大次数和最小次数不能超过2倍 查询速度非常快! 约束: 节点可以是红色或者黑色的 根节点是黑色的 叶子节点(空节点)是黑色的 每个红色节点的子节点都是黑色的 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同 来源: CSDN 作者: 有朝一日刀在手 链接: https:/

数据结构实验之栈与队列七:出栈序列判定

…衆ロ難τιáo~ 提交于 2020-02-26 15:32:51
数据结构实验之栈与队列七:出栈序列判定 Description 给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次。输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序列。 例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个出栈序列,但4,3,5,1,2就不可能是该序列的出栈序列。假设压入栈的所有数字均不相等。 Input 第一行输入整数n(1<=n<=10000),表示序列的长度。 第二行输入n个整数,表示栈的压入顺序。 第三行输入整数t(1<=t<=10)。 后面依次输入t行,每行n个整数,表示要判断的每一个出栈序列。 Output 对应每个测试案例输出一行,如果由初始入栈序列可以得到该出栈序列,则输出yes,否则输出no。 Sample Input 5 1 2 3 4 5 2 4 5 3 2 1 4 3 5 1 2 Output yes no 1 #include<stdio.h> 2 int main() 3 { 4 int i,j,top,n,t; 5 int a[10005]; 6 int b[10005]; 7 int zhan[10005]; 8 scanf("%d",&n); 9 for(i=0;i<n;i++) 10 { 11 scanf("%d",&a

数据结构-树

天涯浪子 提交于 2020-02-26 11:55:37
数据结构-树 定义 树是一种非线性的数据结构,由n(n>0)个有限节点组成,是一个有层次关系的集合,像一棵倒立着的树。 特点 每个节点都只有有限个子节点或无子节点 没有父节点的节点称为根节点 每一个非根节点有且只有一个父节点 除了根节点外,每个子节点可以分为多个不相交的子树 树里面没有环路(cycle) 相关术语 节点:每个元素都叫节点 根节点:树的顶端节点 父子节点:除了根节点以外每个节点都可以找到向上的唯一节点为父节点,下方就是子节点。 兄弟节点:拥有相同父节点的节点 叶节点:没有子树的节点 子树:每个子节点作为根节点所产生的树 节点的度:节点含有子节点的数量 树的度:最大的节点的度 森林:若干棵不相交的树组成的集合 存储结构 public class tree{ private int data; private int parent; } 这里只是简单的写了一下,因为除根外必有一个父节点,所以这里就写了两部分,值域和指针域,一个存放节点的值,一个指向父节点,具体的操作等我复习到二叉树之类再细写。 来源: https://www.cnblogs.com/blogxjc/p/12365810.html