数据结构
so_u
May the odds be ever in your favor
展开
-
链表的增、删、查、找
基本结构 typedef int DataType; typedef struct SListNode { struct SListNode* _next; DataType _data; }SListNode;链表结构分为两部分,一部分是数据域,存放的是节点的数据部分,另一部分是指针域,保存下一节点的地址新建节点 和动态顺序表不...原创 2017-12-20 21:01:32 · 251 阅读 · 0 评论 -
【栈和队列面试题】-----栈的最小值、出栈入栈顺序的合法性
问题1:实现一个栈,要求实现入栈(Push)出栈(Pop)返回最小值(Min),要求时间复杂度为0(1)问题分析:由前面所写的栈的基本操作,我们可知,入栈和出栈的时间复杂度都为0(1),故只需在返回最小值时算法时,满足时间复杂度为0(1)即可思路:以空间换时间,借助双栈(具体过程看下图)具体代码://初始化void MinStackInit(MinStack* mins)原创 2018-01-07 21:35:13 · 501 阅读 · 0 评论 -
【栈和队列面试题】------双栈实现队列,双队列实现栈
问题一:使用两个栈实现队列及其基本操作 思路:栈具有特点后进先出特点,队列具有先进先出的特点,两个栈实现队列,满足以下条件: 入数据时,始终保证栈为空 出数据时,取非空栈的栈顶元素 具体代码://初始化void QueueByTwoStackInit(QBTS* q){ StackInit(&q->_s1); StackInit(&q->_s2);}原创 2018-01-08 21:32:20 · 1106 阅读 · 0 评论 -
堆的基本操作及其应用
堆的定义完全二叉树以顺序存储的形式保存在一维数组当中;其分为小堆和大堆小堆:每一子树的根节点都小于它的左孩子和右孩子,位于堆顶节点的元素是最小的数据大堆:每一子树的根节点都大于它的左孩子和有孩子,位于堆顶节点的元素是最大的数据基本操作1. 向下调整(代码以建立大堆为例)所谓向下调整,给定某一节点,即为父亲节点,选取其孩子节点中较大(或较小)的孩子和其比较,将较大值(或...原创 2018-02-27 20:45:33 · 290 阅读 · 0 评论 -
哈希表基本操作及其扩展
哈希表哈希表的概念: 哈希表本身是一个数组,其元素在数组中存放位置为:通过哈希函数使元素关键码和元素存储位置有一定的映射关系哈希表的特点: 搜索数组中某一元素时,可以通过该元素的关键码和存储位置的映射关系直接找到对应位置查看是否存在在数组中插入元素时,根据哈希函数计算出插入元素的位置并且在此位置存放存在哈希冲突:两个不同的元素通过哈希函数所映射的存储位置相同即为哈希冲突。例如:两个...原创 2018-03-07 20:17:57 · 2478 阅读 · 0 评论 -
位图和布隆源码
哈希及其扩展总结: http://blog.csdn.net/zhangye3017/article/details/79463100位图操作#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<malloc.h>#include<string.h>...原创 2018-03-07 21:33:02 · 225 阅读 · 0 评论 -
海量数据处理问题
哈希切割top K问题问题描述: 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?思路:一个log file的大小为100G,计算机的内存有限,考虑将其切分成1000个小文件,统计次数,我们可以考虑哈希表,相同的IP会映射到同一个小文件中,此时小文件的内存就不受到内存的影响,可统计IP出现的次数使用哈希表,必然...原创 2018-03-03 19:18:02 · 582 阅读 · 2 评论 -
排序算法--------插入排序和选择排序
1. 插入排序直接插入将待排序元素插入到前面已经有序的数组中,直至将待排序元素全部插完(过程如下图)具体步骤: (1)比较待插入元素(key)和有序序列的最后一个元素(a[end]),如果 key&gt;=a[end],直接插入,反之交换key和a[end] (2)如果key&lt; a[end],继续在有序区间里寻找小于key的元素(tmp),将key插入到tmp的后面...原创 2018-03-11 16:31:17 · 308 阅读 · 0 评论 -
排序算法-------交换排序
1. 冒泡排序冒泡排序之前已经熟悉其过程,不在画图,直接上代码void Bubble(DataType* a,size_t n){ assert(a != NULL && n > 0); for(int end = n;end > 0;--end) { int flag = 0; for(in...原创 2018-03-12 16:36:28 · 218 阅读 · 0 评论 -
经典排序算法比较
排序基本概念排序:将一组杂乱无章的数据按一定的规律顺次排列起来。数据表( data list)::它是待排序数据对象的有限集合。排序码(key):通常数据对象有多个属性域,即多个数据成员组成,其中有一个属性域可用来区分对象,作为排序依据。该域即为排序码。每个数据表用哪个属性域作为排序码,要视具体的应用需要而定。排序算法分析1. 排序算法的稳定性如果在元素序列中有...原创 2018-03-12 17:06:57 · 345 阅读 · 0 评论 -
迷宫问题
问题描述 迷宫:一个m×n的网络,有很多墙壁,对前进方向形成了多处障碍。先通过某种方法获得到出口的路线,最短路线 示意图:以6×6网络为例解决方法: 回溯法 概念: 回溯法又称试探法;具体指一步一步向前试探,当某一步有多种选择时,可以先任意选择一种,只要这种选择暂时可行就继续向前,一旦发现到达某步后无法再继续前进,说明前面已经做的选择可能有问题,就可以后退,回到上一原创 2018-01-05 17:05:42 · 256 阅读 · 0 评论 -
【单链表面试题】------快慢指针问题
快慢指针求解查找链表的某一节点(条件:只能遍历一次链表) 思路:没有只能遍历一次链表这个条件时,我们>通常想到的方法是遍历多次链表,但有了这个条>件,我们尝试同时用两个指针(即 fast 和 slow)来遍历链表,当这两个指针从链表的头走到尾时,两个指针走的步数相差某一值时便可达到目的1. 查找单链表的中间节点,要求只能遍历一次链表(具体过程如下图)分析:这里查找中间节点时,快指走 2 步,慢原创 2017-12-29 17:52:47 · 400 阅读 · 0 评论 -
动态顺序表的增、删、查、找
顺序表 同数组一样,一段连续的空间,地址由低到高 分为静态顺序表和动态顺序表静态顺序表typedef int DataType; struct SeqList{ DataType _arr[100]; //顺序表的空间大小 int _size; //当前空间有效数据的大小 };动态顺序表typedef int DataType;struct Se原创 2017-12-16 21:56:42 · 315 阅读 · 0 评论 -
时间复杂度和空间复杂度
时间复杂度定义 一个函数,该函数计算的是执行基本操作的次数表示方法 —- O(N) 一般用 O(N)来表示算法的时间复杂度,N为函数中增长速率最快的表达式一般算法 O(N) 计算方法 忽略常数项,时间复杂度为O(1) 取最坏情况的时间复杂度和增长最快的表达式 递归算法的时间复杂度:递归总次数*每次递归次数几个例子例1: int mul(int n){ if原创 2017-12-07 20:45:46 · 232 阅读 · 0 评论 -
【单链表面试题】------链表相交问题
思考: 两个链表相交,其特点为两个链表共用一个尾;但这两个链表可分为以下两个情况: 情况1:两个链表不带环 情况2:两个链表可能带环其中情况2又可分为以下几种问题: 两个链表都不带环 和情况1是相同的(具体如图1) 一个链表带环,一个不带环 结论:一定不相交 两个链表都带环 a. 不相交 b. 相交 1)环内相交 ...原创 2017-12-30 21:24:49 · 427 阅读 · 0 评论 -
【单链表面试题】-----链表带环问题
判断单链表是否带环,并求得相遇点 思路:快慢指针问题,(前面已经讲过快慢指针原理,在这里不再详细描述) 当快指针比慢指针多走一步,在某个环内一定会相遇在某一点;反过来则有:当两个快慢指针在某一点相遇,这个链表一定是带环的链表,反之不带环(具体过程如图)具体代码://链表是否带环(并返回相遇点)SListNode* SListIsCircle(SListNode* list...原创 2017-12-30 19:30:51 · 279 阅读 · 0 评论 -
【单链表面试题】------复杂链表的复制
问题描述: 一个链表的每一个节点,有一个指向next指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表 先来看复杂链表的结构(配图) typedef struct ComplexListNode { DataType _data; struct ComplexListNode* _nex原创 2017-12-31 15:51:33 · 298 阅读 · 0 评论 -
简易游戏----贪吃蛇
设计思路: 界面设置:采用system()函数来调整界面的大小,背景颜色 绘制地图:采用库函数获取坐标(下面具体介绍) 蛇的设计:采用链式结构实现蛇 食物设计:rand()随机产生食物坐标 蛇的移动:蛇移动实现采用链表相关操作,下面具体介绍 方向控制:采用GetAsyncKeyState()函数,通过键盘操作蛇移动的方向 蛇移动速度:采用Sleep()函数控制原创 2018-01-11 17:03:18 · 584 阅读 · 1 评论 -
【单链表面试题】------链表的打印,删除,插入
从尾到头打印单链表 几种方法: 1)头插法打印;将原有单链表进行头插,在将其新的链表打印出来(会重新开辟空间,故不建议这种做法) 2)递归法打印;当递归到链表的尾时,返回,并打印链表的数据 3)循环法打印;(过程如下图)代码: /*头插法*/void SListPrintBackToFront(SListNode* pHead){ asser...原创 2017-12-29 16:37:03 · 283 阅读 · 0 评论 -
【单链表面试题】--------链表的逆置
逆置单链表 两种方法 1)利用头插法,和前面讲述的从尾到头是一个道理,不在做详细研究 2)三个指针翻转(具体过程如下图)代码:/*三个指针*/SListNode* ReverseList(SListNode* pHead){ SListNode* n1, *n2, *n3; if (pHead == NULL || pHead->_next == NULL)原创 2017-12-29 16:41:19 · 269 阅读 · 0 评论 -
【单链表面试题】------有序链表的合并
合并两个有序链表,合并后依旧有序(以升序为例) 两种算法 1)循环;从头到尾遍历两个链表,比较大小,将较小的数据拿下来尾插 2)递归代码:非递归://合并两个有序单链表,合并后依旧有序SListNode* SListCombineSort(SListNode* list1, SListNode* list2){ SListNode* cur1 ...原创 2017-12-29 16:45:31 · 221 阅读 · 0 评论 -
排序算法-----归并排序、计数排序
1. 归并排序将待排序序列分成两个长度相同的子序列,对每个子序列进行排序,直至子序列剩余一个数,在将其合并成一个序列具体步骤:分组:将待排序序列一分为2,在将子序列进行划分,直至子序列只有一个元素归并:将每个子序列进行排序,将排好序的两个子序列进行合并算法分析稳定性最稳定算法,归并和分组过程中都不会使元素的相对位置发生变化时间复杂度这里采用了二...原创 2018-03-12 20:12:51 · 318 阅读 · 0 评论