数据结构
chuxinlgz
serenity
展开
-
实现基本栈和队列
首先我们来看一下基本实现栈 #pragma once// 静态栈 //template<class T, size_t N = 100> //class Stack //{ //public: // void Push(const T& x) // { // if (_size == N) // { // throw out_of_range("stack原创 2017-09-23 21:49:24 · 198 阅读 · 0 评论 -
海量数据处理题目小结
解决这类题目的思路一般为 (1)能否用特殊的数据结构解决:位图,布隆,堆。 (2)哈希切分 1。给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址 思路分析: 1.要进行哈希切分编号,log file可以看做是字符串,利用哈希字符串转换算法进行转换,转换成整型后,利用哈希函数进行映射,同一IP地址肯定映射到同一编号中, 2.这里我们使原创 2017-11-20 19:03:30 · 274 阅读 · 0 评论 -
平衡搜索树-BTree
B树是一种适合外查找的树,是一种平衡 的多叉树。 一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足一下性质: 1。根节点至少有两个孩子 2。每个非根节点有[M/2,M]个孩子 3。每个非根节点有[M/2-1,M-1]个关键字,并且以升序排列 4。每个节点孩子的数量比关键字的数量多一个。 5。 key[i]和key[i+1]之间的孩子节点的值介于key[i]、ke原创 2017-11-20 17:33:20 · 571 阅读 · 0 评论 -
排序
首先我们看一下排序的种类,排序有比较排序和非比较排序,今天我们主要探讨一下常用的几个排序。 插入排序 插入排序是一种简单直观的排序。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 步骤: 1。从第一个元素开始,该元素可以认为已经被排序 2。取出下一个元素,在已经排序的元素序列中从后向前扫描 3。如果该元素(已排序)大于新元素,将该元素原创 2017-11-28 21:58:40 · 367 阅读 · 0 评论 -
堆
堆是一个用数组表示的完全二叉树,并满足以下两个特性: 1)父节点的键值总是大于或等于(小于等于)其子树上的任意结点 2)每个结点的左子树和右子树都是个堆。 如果父节点的键值总是大于等于任何一个子节点的键值,那么这时称之为最大堆或者大顶堆。 如果父节点的键值总是小于等于任何一个子节点的键值,那么这时称之为最小堆或者小顶堆。#pragma once #include<iostream> #原创 2017-10-16 21:05:22 · 266 阅读 · 0 评论 -
二叉树线索化
二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只 能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。 为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。 enum PointerTag {THREAD, LINK}; template struct原创 2017-10-16 20:11:35 · 209 阅读 · 0 评论 -
容器map与set的增删查改
set的特性是所有元素都会根据元素的键值自动被排序。set的键值就是实值,set不允许两个元素有相同的键值。 标准的STL即以RBTree作为底层机制。 下面我做一个简单的sret测试//#include<stdio.h> //#include"RBTree.h" //#include<windows.h> //int main() //{ // TestRBTree(); // sys原创 2017-11-08 16:11:49 · 311 阅读 · 0 评论 -
RB-tree 红黑树
除AVL树外,还有RBtree也是经常用到的平衡二叉搜索树 RBtree必须满足以下四条规则: 1.每个节点不是红色就是黑色 2.根节点为黑色 3.如果一个节点是红色,则它的 子节点是黑色的(即没有连续的红节点) 4.任一节点至NULL(树尾端)的任何路径,所含黑节点数必须相同 那AVL和RBtree有什么区别 AVltree 是严格平衡的二叉搜索树,其复杂度接近lgN,旋转多,维护起原创 2017-11-04 19:09:12 · 254 阅读 · 0 评论 -
二叉树
非递归是利用栈桢来实现的,而非递归则是用Stack来实现,递归相比较非递归来说,缺陷在栈桢储存在栈上,有可能发生栈溢出。 二叉树代码如下#pragma once #include <queue> #include <stack>template<class T> struct BinaryTreeNode { BinaryTreeNode<T>* _left; BinaryTree原创 2017-10-02 15:58:11 · 219 阅读 · 0 评论 -
回溯法求迷宫
首先我们先“创建”一个迷宫,把其放在Mazemap.txt文件中。 0代表可以走的路,1表示不通的路。首先定义一个结构体,用来存储坐标template<size_t M, size_t N> class Maze { public: Maze(int maze[M][N]) { for (size_t i = 0; i < M; ++i) {原创 2017-10-02 09:08:12 · 219 阅读 · 0 评论 -
STL ——list和vector
首先简单模拟实现List的普通迭代器#include<iostream> #include<assert.h> using namespace std; template<class T> struct __ListNode { T _data; __ListNode<T> *_prev; __ListNode<T> *_next; __ListNode(const T原创 2017-09-21 22:04:31 · 308 阅读 · 0 评论 -
使用两个栈实现一个队列
首先理一下思路 s1:用于入栈。 s2:用于出栈。 (1)入队列:直接将元素压入s1; (2)出队列:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部倒到s2中,再弹出s2的栈顶元素。原创 2017-09-24 16:36:54 · 161 阅读 · 0 评论 -
一个数组实现两个栈
一个数组实现两个栈,共有三个思路 1.奇偶法 2.从中间分别向两边压栈 3.从两边向中间压栈 将数组的起始位置看做第一个栈的栈底,将数组的尾部看做第二个栈的栈底,压栈时,栈顶分别向中间位置移动,直到两个栈顶相遇,则扩容。 第三种 最节省空间,不会造成空间浪费,所以代码实现只实现这一种#include <iostream> #include <Win原创 2017-09-25 21:11:15 · 510 阅读 · 0 评论 -
判断元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)是合法序列
该题依旧考察的是栈的先进后出原则 思路如图 出栈时候先判断S2是否为空,不为空则从S2栈顶元素逐个取出,再从S1中取出剩下的元素 代码实现如下#include<iostream> #include <assert.h> #include <stack> using namespace std; typedef int T; class Stack { public:原创 2017-09-25 20:27:44 · 1262 阅读 · 0 评论 -
两个队列实现一个栈
队列是先进先出,为了实现栈的先进后出原则,我们依旧采用两个队列来实现。 代码实现如下template<class T> class Stack { public: void Push(const T& x) { if(q1.size() > 0) q1.push(x); else if(q2.size() > 0)原创 2017-09-25 19:49:49 · 165 阅读 · 0 评论 -
实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
首先理一下思路,我们可以建两个栈,一个_data,用来存放每一个入栈的数据,另一个_mindata,用来存放数据栈中当前最小的数据。 (1)当data入栈时,首先将data入栈到_data数据栈中,让data与_data的栈顶元素进行比较,当插入的元素小于等于_data的栈顶元素,则将其入栈到_mindata数据栈中。 (2)当元素出栈时,让_data与_mindata的栈顶元素做比较,如果栈顶原创 2017-09-24 11:04:26 · 356 阅读 · 0 评论 -
二叉树面试题
1. 前序/中序/后序遍历(非递归) 前序void PrevOrderNonR() { stack<Node*> s; Node* cur = _root; while (cur || !s.empty()) { while (cur) { cout原创 2017-12-02 23:15:00 · 178 阅读 · 0 评论