数据结构

堆”,\"栈\",\"堆栈\",\"队列\"以及它们的区别

烂漫一生 提交于 2020-03-08 14:32:10
如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到,所以如果你不懂对你是损失很大的。 堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值; ·堆总是一棵完全二叉树。 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。 ②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。 ③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。 ④ 堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。 栈:什么是栈?又该怎么理解呢? ①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 ②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出) ③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FILO(先进后出)的特性,在编译的时候可以指定需要的Stack的大小。 堆栈

数据结构与算法系列十(排序算法概述)

匆匆过客 提交于 2020-03-08 13:43:47
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 在前面两篇,我们详细看了常用算法的第一个主题:递归

数据结构——链表的习题

拟墨画扇 提交于 2020-03-08 13:27:33
题目 将若干城市的信息,存入一个单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。 [基本要求] (1) 能在单链表中插入、删除、更新城市信息; (2) 给定一个城市名,返回其位置坐标; (3) 给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 代码(C++) 借鉴网上的代码 C#没有链表的相关函数,需要自己编写,所以还是C++好用一些 插入函数写了简单的在最后插入,没有写在中间插入 # include <iostream> # include <math.h> # include <conio.h> # include <string> using namespace std ; struct Node //创建结点 { char Name [ 50 ] ; double x; double y ; Node * next ; } ; class List { private : Node * head , * f ;

数据结构与算法系列十(排序算法概述)

旧街凉风 提交于 2020-03-08 12:53:27
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 在前面两篇,我们详细看了常用算法的第一个主题:递归

数据结构 二分法查找

社会主义新天地 提交于 2020-03-08 11:18:09
/* 二分法查找 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* 二分法查找是一种在有序数组中查找特定元素的搜索算法 二分法查找的时间复杂度O(logn) */ //递归算法 int recurbinary(int *a, int key, int low, int high) { int mid; if (low > high) { return -1; } mid = low + (high - low) / 2; if (a[mid] == key) { return mid; } else if (a[mid] > key) { return recurbinary(a, key, low, mid - 1); } else { return recurbinary(a, key, mid + 1, high); } } //非递归算法 int binary(int *a, int key, int n) { int left = 0, right = n - 1, mid = 0; mid = left + (right - left) / 2; while (left < right && a[mid] != key) { if (a[mid] < key) { left = mid +

链表数据结构

这一生的挚爱 提交于 2020-03-08 10:54:17
python实现 链表 的代码如下所示: #链表的创建和连接函数#链表是由数据域item和next连接关系class Node: def __init__(self,item): self.item=item self.next=Nonea=Node(1)b=Node(2)c=Node(3)a.next=bb.next=cprint(a.next.item)#头插法创建链表(倒序)def creat_linklist_head(li): head=Node(li[0]) for element in li[1:]: node=Node(element) node.next=head head=node return head#尾插法创建链表(顺序)def creat_linklist_tail(li): head=Node(li[0]) tail=head for element in li[1:]: node=Node(element) tail.next=node tail=node return head#打印链表的各个元素的函数def print_linklist(lk): while lk: print(lk.item,end=",") lk=lk.nextlk=creat_linklist_head([1,2,3])print_linklist(lk)lk=creat

数据结构_红黑树

梦想的初衷 提交于 2020-03-08 10:00:00
红黑树 二叉树 : binary tree ,是每个结点不超过2的有序 树(tree) 。 简单的理解,就是一种类似于我们生活中树的结构,只不过每个结点上都最多只能有两个子结点。 二叉树是每个节点最多有两个子树的树结构。顶上的叫根结点,两边被称作“左子树”和“右子树”。 如图: 我们要说的是二叉树的一种比较有意思的叫做 红黑树 ,红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。 红黑树的约束: 节点可以是红色的或者黑色的 根节点是黑色的 叶子节点(特指空节点)是黑色的 每个红色节点的子节点都是黑色的 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同 红黑树的特点: ​ 速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍 来源: CSDN 作者: Leon_Jinhai_Sun 链接: https://blog.csdn.net/Leon_Jinhai_Sun/article/details/104725112

数据结构-树状数组

懵懂的女人 提交于 2020-03-08 09:50:27
数据结构-树状数组 参考资料 暂无 树状数组是较堆功能更强大的能解决 \(\texttt{RMQ}\) 问题的数据结构 。 数组数组的前置知识: 位运算 。 数组数组的功能:单点修改区间查询,区间修改单点查询(用差分)。 首先讲 \(lowbit(x)\) ,这是个位运算知识。表示 \(x\) 二进制下为 \(1\) 的最高位,如 \(lowbit((1110010)_2)=(10)_2\) , \(lowbit((110000)_2)=(10000)_2\) , \(\texttt{C++}\) 中的 \(x\&-x\) 正好能达到求 \(lowbit(x)\) 的效果。 然后树状数组中的 \(c\) 数组是个有跳跃性的前缀和数组,它通过 \(lowbit()\) 跳跃维护,然后通过 \(lowbit()\) 跳跃取值。原理较为复杂,不必深究。但是它有如下性质: 1.每次在 \(x\) 位置上 \(+y\) 时,可以这样维护 \(c[]\) : void fix(Tree&t,int n,int x,int y){ for(;x<=n;x+=low(x)) t.c[x]+=y; } 2.如下方法即可求出 \(\Sigma_1^xa[i]\) : int fsum(Tree&t,int x){ int res=0; for(;x;x-=low(x)) res+=t.c[x];

数据结构-字符串-字典树

僤鯓⒐⒋嵵緔 提交于 2020-03-08 09:45:29
数据结构-字符串-字典树 参考资料 暂无 字典树就是著名的 \(trie\) 树,是未来学很多字符串自动机的必备前置知识。 用处:插入字符串,查找字符串出现次数。 这个数据结构就是一个有根树,根节点编号为 \(1\) 。除了根节点外,每个节点上有一个字母。对于每个节点 \(x\) , \(ch[x][c]\) 表示这个节点的儿子中字符为 \(c\) 的那个的编号, \(mk[x]\) 表示插入的字符串中以这个节点为结尾的字符串数。 每当要插入一个字符串 \(s\) (下标从 \(1\) 开始)时,就从根节点 \(1\) 开始,如果根节点 \(1\) 没有字符为 \(s[1]\) 的子节点,就创造一个那个节点,然后无论那个节点是不是刚被创造出来的,走到那个节点。然后再看那个节点有没有字符为 \(s[2]\) 的子节点,然后如此操作,走到 \(s[n]\) (字符串长度为 \(n\) )时, \(mk[\) 单前节点 \(]++\) 。 查找字符串 \(s\) 时,也从根节点 \(1\) 开始,沿着 \(ch[][]\) 数组走,如果发现某次节点没有字符串 \(s\) 的单前字符子节点,那么久说明字符串 \(s\) 以前没有出现过。否则,走到 \(s[n]\) 时,可得 \(s\) 字符串出现的次数就为 \(mk[\) 单前节点 \(]\) 。 \(\texttt{For

数据结构与程序设计第一章编程原则

℡╲_俬逩灬. 提交于 2020-03-08 09:40:58
从软件工程的角度十分重要的编程原则有:问题提出 需求分析 选择数据结构 设计、分析算法 程序编码 软件测试(测试和验证) 程序维护 更为详细的一些原则: 1.大型设计的问题:必须采用一种一致的,统一的和逻辑的方法,也必须仔细遵守程序设计的重要原理。 2.问题说明:将模糊的目标,矛盾的要求和可能未说明的需求转换成能够进行的,精确规划的项目。 3.数据结构的选择:用表,栈和队列为数据处理的重要任务设计一些强大的算法。 4.算法分析 5.测试和验证:程序正确性,维护,运用c++(灵活性,通用性和高效性的结合,使的c++成为目前程序设计员最流行的选择之一。) 来源: https://www.cnblogs.com/wangzhe7470/p/3271589.html