数据结构
文章平均质量分 50
似水流年1990
这个作者很懒,什么都没留下…
展开
-
数组
动态数组:大多数编程语言都提供内置的动态数组,它仍然是一个随机存取的列表数据结构,但大小是可变的,如C++中的vector容器原创 2018-08-31 09:09:55 · 158 阅读 · 0 评论 -
循环队列 (实现)
在循环队列中,我们使用一个数组和两个指针(head 和 tail)。 head 表示队列的起始位置,tail 表示队列的结束位置。class MyCircularQueue {private: vector<int> data; int head; int tail; int size;public: /** Initialize you...转载 2018-09-11 09:11:41 · 607 阅读 · 1 评论 -
二分查找(另一种独特实现)
int binarySearch(vector<int>& nums, int target){ if (nums.size() == 0) return -1; int left = 0, right = nums.size() - 1; while (left + 1 < right){ // Prevent ...转载 2018-09-19 19:48:58 · 213 阅读 · 0 评论 -
哈希表(介绍)
哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。有两种不同类型的哈希表:哈希集合和哈希映射。哈希集合是集合数据结构的实现之一,用于存储非重复值。哈希映射是映射 数据结构的实现之一,用于存储(key, value)键值对。在标准模板库的帮助下,哈希表是易于使用的。大多数常见语言(如Java,C ++ 和 Python)都支持哈希集合和哈希映射。通过选择合适的哈希函数,哈希...转载 2018-09-20 09:16:34 · 264 阅读 · 0 评论 -
排序算法之直接插入(C/C++实现)
void InsertSort(int nArr[], int nLen){ int i, j; int nTemp; for (i = 1; i &amp;amp;amp;lt; nLen;++i) { nTemp = nArr[i]; for (j = i - 1; j &amp;amp;amp;gt;= 0 &amp;amp;amp;amp;&amp;amp;amp;amp; nTemp&原创 2018-11-01 13:04:38 · 452 阅读 · 0 评论 -
排序算法之冒泡排序(C/C++)
void BubbleSort(int nArr[], int nLen){ for (int i = 0; i < nLen-1; ++i) { for (int j = 0; j <nLen-1-i; j++) { if (nArr[j]>nArr[j+1]) { int nTemp = nArr[j]; nArr[j] = nArr...原创 2018-11-02 18:10:20 · 207 阅读 · 0 评论 -
排序算法之快速排序(C/C++实现)
int OnceSort(int arr[], int first, int end){ int i = first, j = end; //当i&lt;j即移动的点还没到中间时循环 while (i &lt; j){ //右边区开始,保证i&lt;j并且arr[i]小于或者等于arr[j]的时候就向左遍历 while (i &lt; j &amp;&amp; arr[i] &am原创 2019-01-16 16:49:01 · 413 阅读 · 0 评论 -
排序算法之选择排序(C/C++实现)
void SelectionSort(int arr[], int length){ for (int i = 0; i &amp;lt; length; i++) { int index = i; for (int j = i+1; j &amp;lt; length; j++) { if (arr[j] &amp;lt; arr[index]) { index = j; ...原创 2019-01-16 17:22:50 · 216 阅读 · 0 评论 -
树/二叉树/满二叉树/完全二叉树/堆 概念汇总
树:一个拥有N 个节点和N-1 条边的一个有向无环图。二叉树:每个节点最多有两个子树的树结构。满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。完全二叉树:二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(满二叉 树),第 h 层所有的结点都连续集中...原创 2019-05-27 17:29:07 · 816 阅读 · 0 评论 -
排序算法之归并排序(C/C++实现)
以下函数用于实现将数组a中,从索引L到R的元素以mid为界,将mid左边(已由小到大排好序)和右边(已由小到大排好序),按照由小到大合并一起放回索引L到R中L mid R(1)将数组a从索引L到R一次放入aux从索引0到R-L(2)若i>mid,则表明mid左边已全部放入a[k],mid右边已排过序,直接一个接一个循环放入a[k]即可(3)与(2)相反,mid左边边已排过...原创 2019-08-02 18:36:27 · 1574 阅读 · 0 评论 -
二叉树遍历之前序遍历,中序遍历,后序遍历
上图遍历结果如下:前序遍历(根左右):ABCDEFGHK中序遍历(左根右) :BDCAEHGKF后续遍历(左右根):DCBHKGFEA以中序遍历为例:先遍历左子树,在遍历根节点,在遍历右子树。上图中,A的左子树为检查B的左子树为空,然后遍历根节点B,得到结果B,然后遍历B的右子树为然后遍历C的左子树,得到结果BD,然后遍历根节点C,得到结果BDC,然后遍历C的右子树为空,返回...原创 2019-08-14 09:10:22 · 1233 阅读 · 0 评论 -
红黑树的性质(自平衡二叉查找树)
红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:性质1:每个节点要么是黑色,要么是红色。性质2:根节点是黑色。性质3:每个叶子节点(NIL)是黑色。性质4:每个红色结点的两个子结点一定都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。...原创 2019-09-19 20:00:14 · 291 阅读 · 0 评论 -
队列(实现)
队列应支持两种操作:入队和出队。入队会向队列追加一个新元素,而出队会删除第一个元素。 所以我们需要一个索引来指出起点。#include <iostream>class MyQueue { private: // store elements vector<int> data; // a pointe...转载 2018-09-11 09:08:34 · 269 阅读 · 0 评论 -
栈和深度优先搜索(DFS)
如上图: 使用 DFS 找出从根结点 A 到目标结点 G 的路径 步骤如下: 1:从根节点A开始,选择节点B的路径,继续深入,直到E,无法更进一步深入,此时栈内容为ABE 依次退栈EB 2:回溯到A节点,选择第二条路径C入栈,E入栈,但E已被访问过,弹出E,回溯到C节点;选择另一条路径 F入栈,G入栈。此时我们找到了G。此时栈内容(路径)为ACFG总的来说,在我...原创 2018-09-14 09:09:07 · 4978 阅读 · 1 评论 -
二维数组
二维数组:多维数组实际上是在内部作为一维数组实现的,而在其他一些语言中,实际上根本没有多维数组 C++ 将二维数组存储为一维数组:如下图,A[M][N]大小为M*N的二维数组的世纪结构为: ...原创 2018-08-31 09:14:48 · 358 阅读 · 0 评论 -
字符串
A:实际是一个UNICODE数组,可执行数组中使用的几乎所有操作 B:还有一些额外操作如下 C++中可比较:有自己的比较函数,如C++语言中支持比较,使用”==”比较两个字符串 (注:实际上会比较这 两个对象是否是同一个对象。) C++中可变:可像在数组中那样修改字符串...原创 2018-08-31 09:26:04 · 157 阅读 · 0 评论 -
双指针应用
给定一个数组和一个值,原地删除该值的所有实例并返回新的长度: int removeElement(vector&amp; nums, int val) { int k = 0; for (int i = 0; i &lt; nums.size(); ++i) { if (nums[i] != val) { nums[k] = num...原创 2018-09-04 09:04:00 · 174 阅读 · 0 评论 -
双指针技巧(一)
反转数组中的元素: void reverse(int *v, int N) { int i = 0; int j = N - 1; while (i < j) { swap(v[i], v[j]); i++; j–; } } 一个从第一个元素开始,另一个从最后一个元素开始。持续交换它们所指向的...原创 2018-09-04 09:07:56 · 269 阅读 · 0 评论 -
二分查找(一个最基本的实现)
int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; int left = 0, right = nums.size() - 1; while(left <= right){ // Prevent (left + right) over...转载 2018-09-17 09:18:33 · 229 阅读 · 0 评论 -
时间复杂度与空间复杂度理解
实例:反转一个单链表 思路:按原始顺序迭代结点,并将它们逐个移动到列表的头部 注意:黑色结点 23 是原始的头结点。 1.我们将黑色结点的下一个结点 6移动到列表的头部: 2. 然后,我们将黑色结点的下一个结点15移动到列表的头部: 3. 黑色结点的下一个结点现在是空。因此,我们停止这一过程并返回新的头结点 15。 在该算法中,每个结点只移动一次。 因此,时间复杂度为 O...原创 2018-09-10 09:19:56 · 693 阅读 · 0 评论 -
双链表简介
单链接列表中的结点具有 Value 字段,以及用于顺序链接结点的“Next”引用字段。 与单链接列表类似,我们将使用头结点来表示整个列表 双链表以类似的方式工作,但还有一个引用字段,称为“prev”字段。有了这个额外的字段,您就能够知道当前结点的前一个结点。我们可以与单链表相同的方式访问数据: 我们不能在常量级的时间内访问随机位置。 我们必须从头部遍历才能得到我们想要的第一个结点。 ...转载 2018-09-10 09:31:35 · 137 阅读 · 0 评论 -
单链表与双链表的联系与区别(从时间与空间复杂度上探讨)
它们在许多操作中是相似的。 它们都无法在常量时间内随机访问数据。 它们都能够在 O(1) 时间内在给定结点之后或列表开头添加一个新结点。 它们都能够在 O(1) 时间内删除第一个结点。但是删除给定结点(包括最后一个结点)时略有不同。 在单链表中,它无法获取给定结点的前一个结点,因此在删除给定结点之前我们必须花费 O(N) 时间来找出前一结点。 在双链表中,这会更容易,因为我们可以使用...转载 2018-09-10 09:37:21 · 2860 阅读 · 1 评论 -
队列和广度优先搜索(BFS)
BFS:全称Breadth First Search,宽度优先搜索,又称广度优先搜索 如上图: 使用 BFS 来找出根结点 A 和目标结点 G 之间的最短路径。 步骤如下: 1:根节点A节点放入队列,将与A相邻的节点放入队列即队列中元素为ABCD 2:A出队,将与队头B相邻的节点放入队列,此时队列元素为BCDE 3:B出队,将与队头C相邻的元素放入队列,此时队列元素为CDEF 4...原创 2018-09-13 09:14:29 · 4193 阅读 · 4 评论 -
二分查找(一个高级点的实现)
int binarySearch(vector&lt;int&gt;&amp; nums, int target){ if(nums.size() == 0) return -1; int left = 0, right = nums.size(); while(left &lt; right){ // Prevent (left + right) overflow...转载 2018-09-18 17:32:06 · 307 阅读 · 0 评论 -
栈(C++实现)
与队列不同,栈是一个 LIFO 数据结构。通常,插入操作在栈中被称作入栈 push 。与队列类似,总是在堆栈的末尾添加一个新元素。但是,删除操作,退栈 pop ,将始终删除队列中相对于它的最后一个元素。#include <iostream>class MyStack { private: vector<int> data; ...转载 2018-09-14 08:53:58 · 276 阅读 · 0 评论 -
哈希表(散列表)解析以及哈希桶算法解析
哈希表:哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。记录的存储位置=f(关键字)这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散...原创 2019-09-24 20:01:22 · 1724 阅读 · 0 评论