随笔分类 -  数据结构

摘要:LSM简介 Log Structured Merge Tree,下面简称 LSM。2006年,Google 发表了 BigTable 的论文。这篇论文提到 BigTable 单机上所使用的数据结构就是 LSM。目前,LSM 被很多存储产品作为存储结构,比如 Apache HBase, Apache 阅读全文
posted @ 2020-06-01 14:29 阿凡卢 阅读(4448) 评论(0) 推荐(0) 编辑
摘要:题目:输入两棵二叉树A和B,判断树B是不是A的子结构bool IsChildTree(Node * father, Node * son){ if(father == NULL && son == NULL) return true; if(father == NULL && son != NULL) return false; if(father != NULL && son == NULL) return true; //如果当前结点相同,判断左右子树是否子结构 if(father->data == son->... 阅读全文
posted @ 2012-11-11 14:20 阿凡卢 阅读(1812) 评论(0) 推荐(0) 编辑
摘要:链表: 1、注意是否有带头结点。 2、单链表的建立:顺序建表(尾插法)、逆序建表(头插法)。单链表插入、删除操作需要寻找前驱结点。 3、双向链表和单向链表相比,多了一个前驱指针,单向链表在删除结点时候要遍历链表,双向链表在删除不需要遍历。 一、判断两个链表是否相交:(假设两个链表都没有环) 1、判断 阅读全文
posted @ 2012-11-10 15:24 阿凡卢 阅读(2582) 评论(0) 推荐(0) 编辑
摘要:BST 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B-树(B树) 是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子;且M>2 阅读全文
posted @ 2012-10-19 20:17 阿凡卢 阅读(978) 评论(0) 推荐(0) 编辑
摘要:Trie—单词查找树Trie,又称单词查找树、前缀树,是一种哈希树的变种。应用于字符串的统计与排序,经常被搜索引擎系统用于文本词频统计。性质:1.根节点不包含字符,除根节点外的每一个节点都只包含一个字符。2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。3.每个节点的所有子节点包含的字符都不相同。优点:1.查询快。对于长度为m的键值,最坏情况下只需花费O(m)的时间;而BST需要O(m log n)的时间。2.当存储大量字符串时,Trie耗费的空间较少。因为键值并非显式存储的,而是与其他键值共享子串。操作:1.初始化或清空:遍历Trie,删除所有节点,只保留根节点。2.插 阅读全文
posted @ 2012-09-03 13:00 阿凡卢 阅读(5339) 评论(0) 推荐(0) 编辑
摘要:hashmap的C++实现按照hashmap的基本原理用C++实现了简单的基本功能,复杂的实现参考C++库的源码,C++最新的标准库里已经有以下四种基于hashtable的容器:unordered_set (C++11) unordered_multiset (C++11) unordered_map (C++11) unordered_multimap (C++11)。具体参考:http://en.cppreference.com/w//* * HashMap.h * Author: luxiaoxun */#ifndef HASHMAP_H_#define HASHMAP_H_#inclu 阅读全文
posted @ 2012-09-02 18:50 阿凡卢 阅读(24528) 评论(7) 推荐(0) 编辑
摘要:hashtable的C++实现,使用两种常用的解决冲突的方式,使用时需要自己提供针对HashedObj的hash函数。1、分离连接法(separate chaining)#include <vector>#include <list>using namespace std;template <typename HashedObj>class HashTable{ public: explicit HashTable(int size = 101); void makeEmpty() { for(int i = 0; i < theLists.size( 阅读全文
posted @ 2012-09-02 11:57 阿凡卢 阅读(10021) 评论(3) 推荐(0) 编辑
摘要:1.冒泡排序(Bubble Sort)冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。... 阅读全文
posted @ 2012-09-01 14:45 阿凡卢 阅读(3408) 评论(7) 推荐(4) 编辑
摘要:1.DFS(深度优先搜索)深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节... 阅读全文
posted @ 2012-08-04 16:02 阿凡卢 阅读(28181) 评论(0) 推荐(7) 编辑
摘要:1、后序表达式求值:后续表达式(逆波兰式)的特点:没有括号。求值方法:从前向后扫,遇到操作数压栈;遇到操作符,从栈中取出2个操作数运算,结果压栈。最终栈中所剩的数为结果。2、中序表达式求值我们先来定义运算符的优先级:(+,-*,/,%从上到下依次升高准备2个栈,一个专门存放运算符,另一个专门存放操作数。1.遇到),那么退栈计算到(为止.结果压栈。2.遇到运算数.那么压栈。3.如果当前运算符优先级低于栈顶运算符.那么计算栈顶运算符并将结果压栈.4.否则压栈.计算带括号和浮点数的表达式:View Code #include<iostream> #include<stack> 阅读全文
posted @ 2012-08-04 12:34 阿凡卢 阅读(7917) 评论(0) 推荐(1) 编辑
摘要:1.判断二叉树是否平衡//求树的高度int TreeDepth(Node* t){ int hl,hr,h; if(t != NULL) { hl = TreeDepth(t->left); hr = TreeDepth(t->right); h = hl>hr? hl:hr; return h+1; } return 0;}//判断二叉树是否平衡int isBalanced(Node* t) { if(t==NULL) return 1; int leftDepth = TreeDepth... 阅读全文
posted @ 2012-08-04 12:10 阿凡卢 阅读(6747) 评论(0) 推荐(1) 编辑
摘要:二叉树的基本操作,都使用递归://二叉树 class Node { public: char data; Node *left; Node *right; Node():data(' '),left(NULL),right(NULL){} Node(char ch):data(ch),left(NULL),right(NULL){} }; //广义表建立二叉树,输入:A(B(D,E(G,)),C(,F))* void CreateBinTree(Node* & Root,char *str) { stack<... 阅读全文
posted @ 2012-08-04 11:52 阿凡卢 阅读(1907) 评论(0) 推荐(0) 编辑
摘要:题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:这是google的一道面试题。看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下 阅读全文
posted @ 2012-08-04 10:47 阿凡卢 阅读(1052) 评论(0) 推荐(0) 编辑
摘要://优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using namespace std; class Node { public: float weight; Node* left; Node* right; char ch; Node(float w,Node* l=NULL,Node* r=NULL,char c=' '):weight(w),ch(c... 阅读全文
posted @ 2012-08-04 10:10 阿凡卢 阅读(1339) 评论(0) 推荐(0) 编辑
摘要:单向循环链表:空表:L->next = L。与单链表的联系:判断表尾的方法不同:单链表用p==NULL;循环链表用p==L。双向循环链表:一个结点包含指向后继(next) 和指向前驱(prior) 两个指针,两个方向又分别构成循环链表。双向循环链表的插入和删除:1.p之后插入ss->next = p->next;p->next = s;s->prior = p;s->next->prior = s;2.p之前插入ss->prior= p->prior;p->prior = s;s->next = p;s->prior-&g 阅读全文
posted @ 2012-08-03 22:28 阿凡卢 阅读(540) 评论(0) 推荐(0) 编辑
摘要:链表:1、注意是否有带头结点。2、单链表的建立:顺序建表(尾插法)、逆序建表(头插法)。3、单链表的插入、删除操作需要寻找前驱结点。单链表的建立、排序和翻转,都是针对有头结点的单链表。#include <iostream>using namespace std;typedef struct Node{ int data; Node * next;}Node,*List;//顺序建表:尾插法void CreateLinkList(List& L, int n){ // 建立空表 L = (List)malloc(sizeof(Node)); L->next = N... 阅读全文
posted @ 2012-08-03 22:00 阿凡卢 阅读(1381) 评论(0) 推荐(0) 编辑