数据结构
文章平均质量分 78
本专栏的所有语言全部用C++编写,数据结构考验的是人的逻辑思维能力,大大提高了编程能力,这里面还有好多的面试题,主要的算法有二叉树,栈和队列,图之类的。。。
poison_biti
这个作者很懒,什么都没留下…
展开
-
huffman树的应用——文件压缩
简述:利用哈夫曼编码进行文件的压缩和解压缩。开发环境:windows,VS2013,C++项目特点: 压缩文件:读取文件中的字符,将其转化为哈弗曼编码,再通过位转化为压缩文件。 解压缩文件:从配置文件中读取字符及对应字符的出现次数建立哈夫曼树,得到解压缩文件中的字原创 2017-07-02 14:46:35 · 584 阅读 · 0 评论 -
连连看——C++简单小游戏
连连看(本次只处理了0转弯和1转弯的情况,2个转弯的情况还没有解决)连连看的规则大家可能都知道,这里的就不重复废话了。这个游戏实现的特别LOW,不过没办法本人能力有限,正在努力的学习以完善这个游戏。代码比较简单,注释代码中都有,我就不做详细的介绍了,相信以你的能力,你很快就能弄明白。“test.cpp”#define _CRT_SECURE_NO_WARNI原创 2016-12-21 21:32:47 · 9062 阅读 · 2 评论 -
图——最小生成树
“test.cpp”#includeusing namespace std;#include#include#include#include "Heap.h"#include "UnionFindFet.h"templateclass GraphLink{public: struct Node { W _w; size_t _src; size_t _ds原创 2016-12-03 11:51:07 · 402 阅读 · 0 评论 -
排序(全)
非比较排序:计数排序,基数排序直接插入排序“test.cpp”#includeusing namespace std;#includevoid InsertSort(int* arr,size_t size){ assert(arr); for(int i = 0;i < size-1;i++) { int j = i; int tmp = arr原创 2016-11-27 22:29:02 · 414 阅读 · 0 评论 -
动态规划——最长升序子序列
问题描述一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4,原创 2016-11-19 09:58:04 · 3342 阅读 · 0 评论 -
面试题——大数据处理解题思路
(1)给一个超过100G大小的log file,log中存着IP地址,设计算法找到出现次数最多的IP地址?解题思路:IP地址是一个32位的字符串,100G在内存中肯定放不下,所以我们必须通过不同的手段去解决。我们可以将100G的文件切分成1000个小文件,对每个文件编号,每个文件的大小是512M,这样内存是很容易读取的。我们将IP地址通过字符串哈希函数处理成对应的整树,将整数模上文件个原创 2016-11-10 22:24:18 · 698 阅读 · 0 评论 -
动态规划——最长公共子序列
“test.cpp”#includeusing namespace std;#include#include#includevoid test(){ string str1 = "ABCBDAB"; string str2 = "BDCABA"; size_t x_len = str1.length(); size_t y_len = str2.length();原创 2016-11-09 22:01:34 · 442 阅读 · 0 评论 -
布隆过滤器
“test.cpp”#include using namespace std;#include "BloomFilter.h"#include void test(){ char* str1 = "1ile:///C:/Users/xjh/AppData/Local/Temp/360zip$Temp/360$0/%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%93%原创 2016-11-08 12:38:40 · 640 阅读 · 0 评论 -
处理哈希冲突的开链法——哈希桶
“test.cpp”#includeusing namespace std;#include"HashList.h"#includevoid test(){ HashList hl; string str[] = {"hash","table","xiao","hai","xia"}; size_t size = sizeof(str)/sizeof(str[0]); f原创 2016-11-08 11:20:33 · 612 阅读 · 0 评论 -
腾讯面试题——位图的应用
题目:给40亿个不重复的无符号整型,没排过序。给一个无符号整数,如何快速判断这个数是否存在在这40亿个数中set()函数图解reset()函数图解“BitMap.h”#pragma once#includeclass BitMap{public: //range 范围 BitMap(size_t range) { //size_t有四个字原创 2016-11-07 15:17:14 · 682 阅读 · 0 评论 -
哈希表——直接定址法
“test.cpp”#includeusing namespace std;#includeenum Status{ EMPTY, EXIST, DELETE,};templatestruct HashTableNode{ K _key; V _value; Status _status; HashTableNode(const K& key = K(),c原创 2016-11-01 21:02:45 · 2105 阅读 · 0 评论 -
平衡二叉树——红黑树
“test.cpp”#includeusing namespace std;enum COLOUR{ BLACK, RED,};templatestruct RBTreeNode{ K _key; V _value; COLOUR _col; RBTreeNode* _left; RBTreeNode* _right; RBTreeNode* _parent;原创 2016-10-30 21:23:57 · 445 阅读 · 0 评论 -
高度平衡二叉树——AVL树
“test.cpp”#includeusing namespace std;templatestruct AVLTreeNode{ AVLTreeNode* _left; AVLTreeNode* _right; AVLTreeNode* _parent; K _key; V _value; int _bf; AVLTreeNode(const K& key,con原创 2016-10-25 13:07:30 · 725 阅读 · 0 评论 -
查找树——搜索二叉树(非递归)
“test.cpp”#includeusing namespace std;templatestruct SearchBinaryTreeNode{ SearchBinaryTreeNode* _left; SearchBinaryTreeNode* _right; K _key; SearchBinaryTreeNode(const K& key) :_left(NU原创 2016-10-18 14:08:27 · 743 阅读 · 0 评论 -
堆应用——堆排序
"test.cpp"#includeusing namespace std;#includevoid AdjustDown(int* arr,size_t size,size_t root){ size_t parent = root; size_t child = 2*parent+1; while(child < size) { if(child+1 arr[ch原创 2016-10-12 23:50:24 · 668 阅读 · 0 评论 -
堆结构——最大堆
“test.cpp”#includeusing namespace std;#includetemplateclass Heap{public: Heap(T* arr,size_t size) { _arr.reserve(size); for(size_t i = 0;i < size;i++) { _arr.push_back(arr[i]);原创 2016-10-11 11:15:06 · 487 阅读 · 0 评论 -
360面试题——搜索二叉树转换成有序的双向链表
360面试题——(不允许创建新的节点)搜索二叉树转换成有序的双向链表这道题有两种思路,一种是创建节点,中序遍历搜索二叉树,然后链表尾插。第二种是线索化二叉树的思想(思路二才是符合题目要求的)核心代码 Node* TreeToList() { if(_root == NULL) { return NULL; } Node* prev = NULL;原创 2016-10-09 16:46:02 · 623 阅读 · 0 评论 -
线索化二叉树
“test.cpp”#includeusing namespace std;#includeenum Tag{ THREAD, LINK,};templatestruct BinaryTreeThdNode{ T _data; BinaryTreeThdNode* _left; BinaryTreeThdNode* _right; Tag _lefttag;原创 2016-10-01 14:22:46 · 491 阅读 · 0 评论 -
遍历二叉树——非递归遍历
“test.cpp”#includeusing namespace std;#include#includetemplatestruct BinaryTreeNode{ T _data; BinaryTreeNode* _left; BinaryTreeNode* _right; BinaryTreeNode(const T& data = T()) :_data(原创 2016-09-28 14:14:48 · 546 阅读 · 0 评论 -
顺序表的基本操作——静态实现
"SeqList.h"#ifndef __SEQLIST_H__//防止重定义#define __SEQLIST_H__#include #include #include #include #define MAX 5typedef int DataType;//typedef语句后面要有一个分号;typedef struct SeqList{原创 2016-05-28 15:39:49 · 597 阅读 · 0 评论 -
通讯录——静态实现
"AddRess.h"#ifndef __ADDRESS_H__#define __ADDRESS_H__#include #include #include #include #define MAX 10 //这里我为了调试方便取了一个较小的数值enum OP{ EXIT = 0,//退出 ADD, //增加联系人 DEL,原创 2016-05-28 15:41:42 · 527 阅读 · 0 评论 -
单链表的简单面试题
#define _CRT_SECURE_NO_WARNINGS 1#include "SListNode.h"void Test1()//PushBack PopBack{ PSListNode pHead = NULL; InitList(&pHead); PushBack(&pHead,0); PushBack(&pHead,1); PushBack(&原创 2016-06-12 22:46:56 · 653 阅读 · 0 评论 -
排序(2)——插入/希尔/选择/快速排序及优化
"Sort.h"#pragma once#include using namespace std;#include #include void InsertSort(int* arr,size_t size)//直接插入排序{ assert(arr); for (int i = 1;i < size;i++) { int j = i-1; i原创 2016-06-16 16:26:11 · 362 阅读 · 0 评论 -
数据结构——迷宫问题
迷宫问题的总体思路是,从迷宫的入口出发,沿着某一个方向向前试探,若能够行得通,则继续往前走,否则原来返回,再换另一个方向继续试探,直到所有可能的通路都被试探过,为了保证在任何一个位置都能够原来返回,需要设置一个堆栈结构来保存从入口到当前位置的路径。原创 2016-06-20 17:47:05 · 931 阅读 · 0 评论 -
(单)链表的基本操作及常见面试题
"SListNode.h"#ifndef __SListNode_H__#define __SListNode_H__#pragma once //能够保证头文件只被编译一次#include #include #include typedef int DataType;typedef struct SListNode { DataType data;原创 2016-06-20 21:13:44 · 472 阅读 · 0 评论 -
数据结构——排序/搜索二叉树(非递归)的基本操作实现
什么是搜索二叉树: 二叉树(binary)是一种特殊的树。二叉树的每个节点最多只能有2个子节点:由于二叉树的子节点数目确定,所以可以直接采用上图方式在内存中实现。每个节点有一个左子节点(left children)和右子节点(right children)。左子节点是左子树的根节点,右子节点是右子树的根节点。 如果我们给二叉树加一个额外的条件,就可以得到一种被称作二叉原创 2016-07-02 22:28:15 · 571 阅读 · 0 评论 -
数据结构——排序/搜索二叉树(递归)的基本操作实现
下面是用C++语言递归的实现的二叉搜索树,并有搜索,插入,删除,寻找最大最小节点的操作。非递归实现请看我的上一篇博客"BSTreeR.h"#pragma oncetemplateclass BSTreeRNode{public: K _key; V _value; BSTreeRNode* _left; BSTreeRNode* _right原创 2016-07-03 11:36:03 · 890 阅读 · 0 评论 -
遍历二叉树——递归实现
二叉树是面试官经常考的面试题,只要熟悉了二叉树的结构,就能很轻松的对付各种问题原创 2016-07-03 14:06:17 · 394 阅读 · 0 评论 -
数字三角形——递归求解
一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。任务就是求出最佳路径上的数字之和。注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数。 以下是代码实现#include using namespace std;#define MAX 100int Arr原创 2016-07-06 13:19:24 · 3527 阅读 · 0 评论 -
遍历二叉树——递归和非递归(栈和队列的应用)实现
"BinaryTree.h"#pragma once#include #include templateclass BinaryTreeNode{public: T _date; BinaryTreeNode* _left; BinaryTreeNode* _right;public: BinaryTreeNode(const T& date原创 2016-07-06 14:24:52 · 1000 阅读 · 1 评论 -
高度平衡的二叉树——AVLTree
旋转图解在代码的后头AVL树本质上还是一棵二叉搜索树(因此读者可以看到我后面的代码是继承自二叉搜索树的),它的特点是:1. 本身首先是一棵二叉搜索树。 2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。原创 2016-07-22 16:13:03 · 437 阅读 · 0 评论 -
高效的平衡搜索树——红黑树
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:性质1. 节点是红色或黑色。性质2. 根节点是黑色。性质3 每个叶节点是黑色的。性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)红黑树的插入分为以下三种情况第原创 2016-07-24 23:53:19 · 1068 阅读 · 0 评论 -
数据结构——线索化二叉树
将二叉树变为线索二叉树的过程称为线索化。按某种次序将二叉树线索化的实质是:按该次序遍历二叉树,在遍历过程中用线索取代空指针。算法根据二叉树遍历的方式而定。只需要将遍历算法中访问结点的操作具体化为建立正在访问的结点与其非空中序前趋结点间线索。该算法应附设一个指针pre始终指向刚刚访问过的结点(pre的初值应为NULL),而指针p指示当前正在访问的结点。结点*pre是结点*p的前趋,而*p是*pre的后继。前序线索化和后序线索化算法与二叉树的中序线索化类似。原创 2016-07-29 14:14:31 · 431 阅读 · 0 评论 -
STL——迭代器的初步认识
什么是迭代器: 迭代器()是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。 迭代器是个所谓的智能指针,具有遍历复杂数据结构的能力。原创 2016-08-01 13:59:50 · 287 阅读 · 0 评论 -
STL——迭代器失效
迭代器失效: 指向不再存在的元素的迭代器。无效迭代器的使用未定义,可能会导致严重的运行错误。 众所周知当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此很多建议都是让我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器进行正确的操作迭代器失效的类型了: 1.由于容器原创 2016-08-01 15:13:51 · 448 阅读 · 0 评论 -
小米面试题——并查集(关于朋友圈问题)
假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写出程序求出这n个人里一共有多少朋友圈。 例如:n=5,m=3,r={{1,2},{2,3},{4,5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友。则1,2,3属于一个朋友圈,4,5属于另一个朋友圈,结果为两个朋友圈在处理这道题的时原创 2016-08-02 19:29:11 · 1173 阅读 · 0 评论 -
适用于外查找的平衡树——B树
什么是B树: 1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,kj查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查的关键字在某个Ki或Ki+1之间,于是取Pi原创 2016-08-02 23:44:59 · 825 阅读 · 0 评论 -
数据结构——实现最大堆
什么是堆:堆数据结构是一种数组对象,它可以被视为一科完全二叉树结构。它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。什么是最大堆:最大堆是堆的两种形式之一。根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆(大顶堆)。大根堆要求根节点原创 2016-08-05 18:08:22 · 704 阅读 · 0 评论 -
实现大堆小堆——仿函数的应用
仿函数:就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。“Test.cpp”#define _CRT_SECURE_NO_WARNINGS 1#include using namespace std;#include "Heap.h"void Test(){ int arr[] = {10,16,原创 2016-08-06 10:46:01 · 429 阅读 · 0 评论 -
堆的应用——在N个数中找到最大的前K个数
在堆的应用中,有一道很经典的面试题,题目是:“在100w个数中找到最大的100个数”。对于堆的相关知识和堆实现的代码在我的前2前博客中都有详解,对于这道题会有很大的帮助。 让我们来剖析一下这道题,我们先建立两个数组,一组数组arr的大小为N,另一组数组topk的大小为K,显然,我们要对topk建堆。找最大的前K个数字自然要建立小堆。则根节点(即topk[0])是K个数字中最小的一原创 2016-08-18 12:20:27 · 762 阅读 · 0 评论