数据结构
Steve_Abelieve
致虚极,守静笃。
展开
-
图的基本操作
我们采用邻接矩阵的方式来存储图: 基础练习: 1.图的深度优先遍历 2.图的广度优先遍历#ifndef CMAP_H#define CMAP_H#include<vector>using namespace std;#include"Node.h"class CMap{public: CMap(int capacity); ~CMap(); bool addNo原创 2017-04-12 00:15:29 · 420 阅读 · 0 评论 -
二叉树的最近公共祖先、两个最远节点、第K层结点个数、出现次数超过一半的元素
1.个结点的最近公共祖先 实现思路:保存两个节点的路径,然后进行判断相同根节点typedef BNode TreeNode;bool GetNodePath(TreeNode* pHead, TreeNode* pNode, std::list<TreeNode*>&list){ //没有找到,就在就直接pop if (pHead == pNode) {原创 2017-07-22 17:05:09 · 679 阅读 · 0 评论 -
二叉树的高度 、销毁、链表的翻转(k为一组、n-m 之间)两种实现、
1.二叉树的高度://实现思路:左右子树较高的一支,将其结果结+1就是当前树的高度size_t GetHeight(Node* pRoot){ if (pRoot) { size_t left = GetHeight(pRoot->pLeft); size_t right= GetHeight(pRoot->pRight); ret原创 2017-07-23 12:16:54 · 446 阅读 · 0 评论 -
实现memcpy和memmove以及大数据url交集。
1.模拟实现C库的memcpy和memmove。void* myMemcpy(void* dst,const void* src,size_t size){ assert(src); assert(dst); char* _dst = (char*)dst; char* _src = (char*)src; while (size--) {原创 2017-08-09 08:20:55 · 573 阅读 · 0 评论 -
判断二叉树是否平衡、求二叉树的镜像、按行列有序矩阵中快速查找元素是否存在
1.判断二叉树是否平衡//实现思路:从下往上进行判断, 左右子树高度差不超过2 ,但是返回结果是bool 类型, 并且要保存树的高度,因此需要增加一个额外参数bool isBalance(BNode* pHead, int& height){ if (!pHead) return true; int left = 0, right = 0; if (!is原创 2017-07-24 20:10:03 · 408 阅读 · 0 评论 -
模拟实现atoi和itoa以及100G 的IP地址求出现次数最多的前K个IP
1.模拟实现C库的atoi和itoa。 2.给一个超过100G的log file, log中存着IP地址, 设计算法找到出现次数最多的100个IP地址?1.题考察面试者的思维方式:完整性和鲁棒性 先想好测试用例,沟通好错误处理,才能满意的做完。错误需要考虑的情况有: 1.当字符串为空时返回0,0字符串返回值也是0,但是两者的含义不同,我们应该做到区分,怎么区分? 定义全局变量,设原创 2017-08-09 19:28:59 · 973 阅读 · 0 评论 -
求一个无序数组的中位数
求一个无序数组的中位数。如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。 要求:不能使用排序,时间复杂度尽可低。实现思路:解法一:快排思想【背景知识】 1.快速排序可以实现将数据划分为 三部分 : 左边小于基准值 基准值 右边大于基准值位置2.每次划分都可以将基准值的最终确定, 那这样的话,我们找中位数就很方便了。原创 2017-08-04 16:42:52 · 2905 阅读 · 1 评论 -
字符串右旋 、 字符串去重
1.–将N个字符的数组,循环右移K位。时间复杂度O(N)。实现思路: 两种实现思路:1.借助辅助空间,按照后面的顺序进行拷贝,最后拷贝回字符串 2.三次反转法就可实现#include<algorithm>void RotateKth(char str[],int size,int k){ //三步翻转法 k %= size; /*Reverse(&str[0], k)原创 2017-08-04 23:43:48 · 598 阅读 · 0 评论 -
实现一个位图、100亿个整数找出只出现一次的整数、找出现次数不超多2次的数
1.–实现一个位图。 位图特点: 节省空间 适合数据比较密集的情况 适合判断事件 是否 这样的问题 相关位运操作: & | ~ 代码实现:#include<iostream>#include<vector>using namespace std;////1.【基础题】--实现一个位图。//位图特点: 节省空间,适合数据密集的情况class BitSet{原创 2017-08-05 23:41:54 · 3666 阅读 · 0 评论 -
二叉树 的构建、层序遍历
1.根据前中序构建一颗二叉树struct BNode{ BNode(int val) :pLeft(NULL) , pRight(NULL) ,data(val) { } BNode* pLeft; BNode* pRight; int data;};BNode* _RebulidBinaryTree(BNode* &pRo原创 2017-07-21 23:52:01 · 499 阅读 · 0 评论 -
开始造轮子-红黑树的实现
概念红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结 点的颜色,可以是red或者black,通过对任何一条从根节点到叶子结点上 的简单路径来约束,红黑树保证最长路径不超过最短路径的两倍,因而近视 平衡。性质每个结点不是红色就是黑色根节点是黑色的如果一个根节点是红色的,则它的两个叶子结点是黑色的(没有两个连续 的红色结点)对于每个结点,从该结点到其所有后代叶结点的简单路径原创 2017-06-26 22:57:09 · 325 阅读 · 0 评论 -
剖析——SGI版本下的空间配置器
1.为什么STL中会把空间配置器单独给出来呢? 编号 原因 解释 ① 解决代码冗余 每个容器中都写出来,会造成代码冗余 ② 用户自己申请容易内存泄漏 ③ 效率不高 malloc,会引发brk系统调用执行的过程 ④ 造成内存碎片 申请小块内存,造成内存片段间有很多碎片没有利用 ⑤ 额外负载 系统用来管理内存会额外开辟结构体2.空原创 2017-07-12 15:12:34 · 292 阅读 · 0 评论 -
二叉树的基本操作
百度百科:二叉树 刷题是学习数据结构,整理自己的思路最快的方法。所以推荐大家多思考,人人都会敲代码,但是思路不一定每个人都会有。题目主要问题 1.求一个结点的父节点 2.求结点的左兄弟结点或右兄弟结点 3.求一颗二叉树的高度 4.求结点i的深度 5.根据一颗二叉树的前序和中序重建一棵二叉树1.求一个结点的父结点 方法一:我们知道,二叉树的相关操作无非就是,几种遍历原创 2017-04-29 13:40:53 · 586 阅读 · 0 评论 -
【leetcode】链表的基本操作
题目一: Reverse a singly linked list. 1->2->3->NULL NULL-<1-<2-<3解法:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) :原创 2017-04-29 21:27:34 · 2265 阅读 · 0 评论 -
【leetcode】插入排序一个链表
ListNode* insertionSortList(ListNode* head){ ListNode * new_head = new ListNode(0); new_head->next = head; ListNode* pre = new_head; ListNode*cur = head; while (cur) { i原创 2017-04-29 23:22:15 · 367 阅读 · 0 评论 -
迷宫出口以及迷宫最短路径的求解
整理出来方便大家复习//完成迷宫#pragma warning (disable:4996)#include<iostream>#include<vector>#include<stack>using namespace std;#include<assert.h>//创建迷宫->动态创建二维数组:1.int[][N] 2.int*->(二维数组是按照一维数组来存储的)//打印迷宫原创 2017-04-20 15:36:57 · 1671 阅读 · 0 评论 -
二叉树基本操作汇总练习
#include<iostream>#include<queue>#include<assert.h>using namespace std;//二叉树的构建、销毁、赋值,拷贝构造。、遍历、修改、查找、template<typename T>struct BinaryTreeNode{ BinaryTreeNode<T>(const T&data=T()) : _data原创 2017-05-10 23:14:13 · 341 阅读 · 0 评论 -
稀疏矩阵的相关操作(存储、转置、快速转置、相加)
题目要求:稀疏矩阵的压缩存储template<class T>class SparseMatrix{ template<class T> struct Trituple { Trituple(size_t row, size_t col, const T& data) : _row(row) , _col(原创 2017-04-22 23:35:22 · 1254 阅读 · 1 评论 -
二叉搜索树
【背景知识】当我们在数组中查找一个元素时, ①如果数组乱序排列,我们的查找复杂度为O(N) ②如果数组有序排列,我们的查找复杂度为O(log2 N)同样的思想,我们在二叉树里面进行查找 ①如果没有任何分布规律,我们只能去进行遍历查找,的查找复杂度为O(N) 那我可不可以利用二分的思想,将二叉树在每次查找的时候,将查找的范围缩小至一半呢? 答案是可以的。(暂时忽略高度问题原创 2017-05-17 00:07:57 · 305 阅读 · 0 评论 -
二叉树的前中后序遍历的模板实现
模拟递归的过程,利用栈的特点来实现遍历。 我们增加一个结构体,用来标示当前的状态:printf/go 来完成前中后序的遍历。 struct Command { string s; //ptint/go两种状态 TreeNode* node; Command(string s,TreeNode* node) :s(s),node(node) {原创 2017-06-05 07:18:42 · 341 阅读 · 0 评论 -
简单布隆过滤器实现、布隆过滤器扩展
1.【基础题】–实现一个简单的布隆过滤器。 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映原创 2017-08-06 22:09:13 · 891 阅读 · 0 评论