数据结构
文章平均质量分 59
whiltes
Life's a Struggle!
展开
-
静态顺序表
静态顺序表练习//seqlist.h#pragma once #include <stdio.h>#include <assert.h>#define MAX_SIZE 10////////////////////////////////////////////////////////////////////////////////typedef ...原创 2018-04-07 19:09:28 · 302 阅读 · 0 评论 -
栈的简单应用——简单迷宫的求解
如图,一个不带环且只有一条通路的简单迷宫我们想要解此迷宫,思路如下:普通求解利用栈结构首先从入口进去,这里要判断入口是否合法,走一步将其标记成2,并且入栈,代表已经走过我们从该点,一次向上,左,右,下四个方向探索 ,值为 1代表能走通,入栈,如果都走不通,将其标记为3, 退一步,将当前坐标出栈。 代码试下如下Maze.h#include "SqStack.h"...原创 2018-04-29 19:48:05 · 1876 阅读 · 2 评论 -
带环迷宫的递归求解(多条通路,求最短)
如图迷宫,求解带环迷宫的出口 - 同样利用递归求解,不同的是没走一步,要标记成上一步大1的值 - 当到达出口后,更新最短路径,然后回退,找别的方向的路线,在回退时,碰到标记数值比自己大的是走不通的。思路 找到一条路径后,然后找第二条 代码如下Maze.h #include "SqStack.h"#define MAX_ROW 4#define ...原创 2018-04-29 20:13:43 · 734 阅读 · 0 评论 -
二叉搜索树(递归&非递归)
1、二叉搜索树的概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树。若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有的节点的值都大于根节点的值它的左右子树也分为二叉搜索树 此二叉树的中序遍历结果为: 0,1,2,3,4,5,6,7,8,9;2、二叉搜索树的基本操作完整源代码在此1.初始化二...原创 2018-05-14 21:18:52 · 2637 阅读 · 0 评论 -
浅谈搜索结构之哈希
待写原创 2018-05-22 01:45:08 · 431 阅读 · 0 评论 -
哈希之闭散列(线性探测/二次探测)
HashTable.h#include &lt;assert.h&gt;#include &lt;stdio.h&gt;#include &lt;malloc.h&gt;#include "Common.h"//哈希表位置的状态typedef enum State{ EMPTY, //当前位置为空 EXIST, //当前位置有元素原创 2018-05-22 01:52:11 · 715 阅读 · 0 评论 -
哈希之开散列
HashBucket.c#pragma once#include &lt;assert.h&gt;#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;malloc.h&gt;//#include "Common.h"#define size_t uns原创 2018-05-22 02:10:48 · 255 阅读 · 0 评论 -
排序的基本概念(及常见的排序算法)
排序的概念排序排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。排序码通常数据元素有多个属性域,其中有一个属性域可用来区分元素,作为排序依据,该域即为排序码。按主排序码进行排序,排序的结果是唯一的。按照次排序码进行排序,排序的结果不是唯一的。排序算法稳定性如果在元素序列中有两个元素R[i]和R[j],他们的排序码K[i]==K[j],且在排序之前,...原创 2018-05-28 21:47:13 · 3912 阅读 · 1 评论 -
常见的排序算法——插入排序
插入排序a. 基本思想每一次将一个待排序的元素,按其排序码的大小,插入到前边以排好序的合适位置上,直到元素全部插完为止。直接插入排序当插入第 i 个元素时,前边的 i - 1 个元素已经排好序,此时用第 i 个元素和 i - 1、i - 2、…..的元素比较,找到插入位置即将第i个元素插入,原来的位置上的元素顺序后移。 代码如下:void InsertSo...原创 2018-05-28 23:13:37 · 691 阅读 · 1 评论 -
常见的排序算法——选择排序
选择排序基本思想每一趟在后面 n - i 个待排序的数据元素集合中选择出关键码最小的数据元素,作为有序元素序列的第i个元素。待 到第 n - 2 趟做完,待排序元素集合中只剩下一个元素,排序结束。直接选择排序在元素集合array[i]—-array[n-1]中选择关键码最大(小)的数据元素若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)...原创 2018-05-28 23:46:34 · 539 阅读 · 0 评论 -
哈希之海量数据面试题
哈希切割TopK问题给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 1) 我们首先想到的是对文件进行切割,把它分成1000等份,每一份差不多100M左右。但是在切割时要注意,不能随便切割。如果我们随便进行切割,统计出每个文件中出现次数最多的IP地址,这不一定是整个文件出现次数最多的IP地址。假设,一个IP地址,在第一个文件...原创 2018-05-29 01:01:18 · 390 阅读 · 1 评论 -
常见的排序算法——交换排序
交换排序利用交换元素的位置进行排序的方法称作交换排序。 常见的交换排序的方法:冒泡排序和快速排序。冒泡排序基本思想比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素就是是最大的数。针对所有的元素重复以上的步骤,除了最后一个。 -持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数...原创 2018-05-29 16:38:40 · 4989 阅读 · 0 评论 -
常见的排序算法——归并排序
基本思想将待排序的元素序列分成两个长度相等的子序列,对每一个子序列排序,然后将他们合并成一个序列。合并两个子序列的过程称为二路归并。 归并排序核心步骤:分组归并 代码如下递归void _MergeData(int array[], int left, int mid, int right, int *temp){ //左闭右开区间 int l...原创 2018-05-29 16:50:54 · 481 阅读 · 0 评论 -
栈和队列面试题
1、实现一个栈,要求实现Push(栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)利用一个栈利用两个栈2、使用两个栈实现一个队列3、使用两个队列实现一栈4、判断入栈顺序的合法性5、一个数组实现两个栈(共享栈)利用奇偶位置两个栈相向而生1、实现一个栈,要求实现Push(栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为...原创 2018-04-29 01:46:37 · 440 阅读 · 0 评论 -
队列的基本操作
循环队列Queue.h Queue.c动态队列Queue.h Queue.c1、循环队列Queue.h#pragma once #include <stdio.h>#include <stdlib.h>#include <assert.h>#define MAX_SIZE 8typedef int DataType...原创 2018-04-29 00:43:14 · 293 阅读 · 0 评论 -
时间复杂度和空间复杂度
时间复杂度 常见的时间复杂度 最坏时间复杂度和平均时间复杂度 求时间复杂度的方法 常用排序算法的时间复杂度 空间复杂度 尾递归首先我们来理解一下算法的复杂度? 算法的时间复杂度和空间复杂度统称为算法的复杂度。 时间复杂度是值执行算法所需要的计算工...原创 2018-04-08 17:33:11 · 617 阅读 · 0 评论 -
链表的基本操作
链表的常见面试题头文件声明//SList.h#pragma once#include <stdio.h>#include <assert.h>#include <stdlib.h>#include <windows.h>typedef int DataType;typedef struct Node{ str...原创 2018-04-15 19:08:32 · 300 阅读 · 0 评论 -
链表的常见面试题
链表的基本操作逆序打印单链表 删除链表的非尾结点,要求:不能遍历链表 在链表pos位置前插入值到data的结点 查找链表的中间结点,要求只能遍历一次链表 查找链表的倒数第K个结点,要求只能遍历一次链表 删除链表的倒数第K个结点,要求只能遍历一次链表 用单链表实现约瑟夫环 链表的逆置–三个指针 链表的逆置–头插法 用冒泡排序思想对单链表进行排序 合并两个有序单链表,合并后依然...原创 2018-04-16 11:53:54 · 465 阅读 · 0 评论 -
动态顺序表练习
//SeqListD.h#pragma once#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <assert.h>typedef int DataType;typedef struct SeqListD{ DataType *_arr...原创 2018-04-11 10:51:47 · 283 阅读 · 0 评论 -
栈的简单应用(括号匹配、逆波兰表达式)
顺序栈的基本操作链式栈的基本操作括号匹配//SqStack.cint IsBracket(char ch){ if (('}' == ch) || ('{'== ch)|| (']' == ch) || ('[' ==ch)|| (')' == ch) || ('('==ch)) { return 1; ...原创 2018-04-23 15:47:30 · 308 阅读 · 0 评论 -
二叉树的遍历(前/中/后/层,递归&非递归)
二叉树的创建二叉树的其他面试题1、前序遍历递归void PreOrder(PBTNode pRoot){ if (NULL == pRoot) return; else { printf(&amp;quot;%c&amp;quot;, pRoot-&amp;amp;gt;_data); PreOrder(pRoot-&amp;amp;gt;pLef原创 2018-05-09 13:38:08 · 274 阅读 · 0 评论 -
二叉树的基本操作(创建和删除)
BinTree.h#pragma once#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;assert.h&gt;#include &lt;string.h&gt;//#include "Stack.h"#include "Queu原创 2018-05-05 19:27:48 · 391 阅读 · 0 评论 -
二叉树的经典面试题
二叉树的基本操作代码中用到的栈代码中用到的队列面试题拷贝二叉树前序遍历非递归二叉树的镜像递归二叉树的镜像非递归求二叉树中结点的个数获取二叉树中叶子结点的个数求二叉树中K层结点的个数求二叉树的高度1、拷贝二叉树利用递归,依次拷贝根结点,左子树,右子树代码如下PBTNode CopyBinTree(PBTNode pRoot){...原创 2018-05-05 20:29:52 · 416 阅读 · 0 评论 -
堆的基本操作解析
堆的完整 源代码什么是堆首先,堆是完全二叉树。 小堆: 任何一个节点的值都小于它的左右孩子的值,位于堆顶节结点的值是最小的,从根结点到每个结点的路径上数组元素组成的序列是递增的。 大堆:任何一个节点的值都大于它的左右孩子的值,位于堆顶节结点的值是最大的,从根结点到每个结点的路径上数组元素组成的序列是递减的。堆的基本操作简单解析建堆先申请一块空间,然后在对其赋值形成二叉树,...原创 2018-05-13 15:59:38 · 538 阅读 · 0 评论 -
浅谈堆排序
堆的基本操作1、堆排序思路比如,我们想要对数组进行降序或者升序排序,堆的根节点的值是整个堆中的最值(最小或者最大),监于这一点。,将根节点与最后一个节点对换,这样根结点就是堆里的最值(最小或者最大),形成去除最值后的一个新堆(大小减1),对新堆在进行调整,使其符合堆的特性,然后在进行类似操作直到堆里只剩下一个值。此时,得到的就是排序后的数组(用最大堆可获得升序数组,用最小堆可获得降序数组)...原创 2018-05-13 17:14:06 · 193 阅读 · 0 评论 -
用堆封装优先级队列
优先级队列优先队列是一种数据结构,能够保证每次出队的是队列中优先级最高的元素(可以自己定义比较器),使用堆的堆顶元素维护这个优先级最高的元素,因为堆具有堆序性,堆顶元素要么是最小的,要么是最大的。具体代码实现代码中用到的堆PriorityQueue.h#pragma once #include "Heap.h"typedef struct PriorityQu...原创 2018-05-13 21:43:42 · 251 阅读 · 0 评论 -
堆的简单应用——TopK
海量数据top k问题100亿个数中找出最大的前K个数,我们可以遍历K次找到,但是时间复杂度就很大为 O(KN);因此,我们可以用堆来实现,只需遍历一次,思路如下:如果要找前K个最大的数,我们用小堆,每次用堆顶元素和遍历的数比,如果堆顶元素小,则让堆顶元素的值等于它,然后向下调整如果要找前K个最小的数,我们用大堆,每次用堆顶元素和遍历的数比,如果堆顶元素大,则让堆顶元素的值等于它,然后...原创 2018-05-14 00:47:41 · 3261 阅读 · 0 评论 -
常见的排序算法—— 非比较排序
计数排序计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用操作步骤:统计相同元素出现次数根据统计的结果将序列回收到原来的序列中 代码如下:基数排序基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”...原创 2018-06-07 16:29:49 · 1534 阅读 · 0 评论