Classic Data Structure
文章平均质量分 78
介绍经典的数据结构,以及与之相关的算法。
并给出代码。
L_J_SHOU
从蛛丝马迹中寻找结果
展开
-
数据结构 《22》---- 二叉树三种遍历的迭代器算法
二叉树的三种遍历有递归版本,和迭代版本。本文介绍一种新的思路。参考了 http://coolshell.cn/articles/9886.html在许多应用中,我们还需要对遍历本身进行抽象。假如有一个求和的函数sum,我们希望它能应用于链表,数组,二叉树等等不同的数据结构。这时,我们可以抽象出迭代器(Iterator)的概念,通过迭代器把算法和数据结构解耦了,使得通用算法能应用于不同类原创 2014-07-07 15:59:09 · 3459 阅读 · 0 评论 -
数据结构《21》----2014 WAP 初试题----Immutable queue
用上一篇文章的immutable stack 来实现 immutable queue.其实就是用两个栈实现队列,就//copyrigt @ L.J.SHOU May.25, 2014#include using namespace std;/** * This class is a functional datatype, representing * a原创 2014-06-17 15:08:55 · 2069 阅读 · 0 评论 -
数据结构《20》----Immutable stack
有趣的函数式数据结构《一》----不可变栈什么是不可变?往栈中插入一个元素,原来的栈保持不变,返回一个新的栈(已插入新的元素)。push, pop,getMax 等操作都要求在 常数时间内完成。可能读者会产生疑惑,既然要返回一个新的栈,是不是就必须先拷贝一份原来的栈,然后在新的栈中插入元素。但是这样复杂度就是线性的,如何能够在常数时间内完成呢??这里,就是immutab原创 2014-06-17 14:55:42 · 1826 阅读 · 0 评论 -
数据结构《19》----String容器的三种实现
一、序言一个简单的string 容器到底是如何实现的?本文给出了 String 的三种从易到难的实现,涉及了 reference counting, copy on write 的技术。二、第一个实现我们设计的string类里面包含一个char* 的指针, 通过指针的管理,来实现string的基本功能。废话不多说了,直接上代码:{CSDN:CODE:原创 2014-05-10 16:29:21 · 1443 阅读 · 0 评论 -
数据结构 《18》----RMQ 与 LCA 的等价性 (一)
前言 RMQ: 数组 a0, a1, a2,..., an-1, 中求任意区间 a[i+1], a[i+2], ..., a[i+k] 的最小值 LCA: 求二叉树中两个节点的最低公共祖先 本文将证明这两个问题可以相互归约为另一个问题。证明 先通过一个简单的例子来说明问题。见下图: 求 [7 2 8 6] 的最小值原创 2014-05-01 00:22:04 · 1569 阅读 · 0 评论 -
数据结构《17》---- 自动补齐之《二》----Ternary Search Tree
一、 序言上一篇文章中,给出了 trie 树的一个实现。可以看到,trie 树有一个巨大的弊病,内存占用过大。本文给出另一种数据结构来解决上述问题---- Ternary Search Tree (三叉树)二、数据结构定义Trie 树中每个节点包含了 26 个指针,但有很大一部分的指针是 NULL 指针,因此浪费了大量的资源。一种改进措施就是,以一棵树来代替上述的指针数组。原创 2014-04-29 23:23:10 · 1878 阅读 · 0 评论 -
数据结构《16》----自动补齐实现《一》----Trie 树
1. 简述Trie 树是一种高效的字符串查找的数据结构。可用于搜索引擎中词频统计,自动补齐等。在一个Trie 树中插入、查找某个单词的时间复杂度是 O(len), len是单词的长度。如果采用平衡二叉树来存储的话,时间复杂度是 O(lgN), N为树中单词的总数。此外,Trie 树还特别擅长 前缀搜索,比方说现在输入法中的自动补齐,输入某个单词的前缀,abs,立刻弹出原创 2014-04-25 22:47:09 · 2694 阅读 · 0 评论 -
动手实现自己的 STL 容器《2》---- list
1. 序: 本文参考了侯捷的 《STL 源码分析》一书,出于兴趣,自行实现了简单的 list 容器。 学习了 STL 的 list 容器的源代码,确实能够提高写链表代码的能力。其中的 sort 函数,可谓是非常神奇。。。2. 实现的细节 STL 的 list 容器采用了一个带有尾节点的环状双向链表。 如下图所示:// Last Update:2014原创 2014-04-20 21:47:53 · 1266 阅读 · 0 评论 -
数据结构《11》----二叉树遍历的非递归版本(栈)
二叉树的前序,中序,后序遍历的非递归版本有许多种。较为简单的是采用栈,来模拟递归。此外,还可以采用标记,或者父亲指针来实现。前序和中序相对比较简单,代码仅仅相差一行。后序相对比较复杂,需要记录右子树是否已经访问。前序遍历:void PreOrderVisitStack(struct TreeNode * root){ stack s; while(root原创 2014-02-12 11:08:03 · 1777 阅读 · 0 评论 -
数据结构《10》----二叉树 Morris 中序遍历
无论是二叉树的中序遍历还是用 stack 模拟递归, 都需要 O(n)的空间复杂度。Morris 遍历是一种 常数空间 的遍历方法,其本质是 线索二叉树(Threaded Binary Tree), 本质上其实就是利用二叉树中 n+1 个指向NULL的指针。关于 线索二叉树 见 http://blog.csdn.net/shoulinjun/article/details/19037819原创 2014-02-11 19:33:08 · 6358 阅读 · 1 评论 -
数据结构《14》----并查集 Union-Find
描述: 并查集是一种描述解决等价关系。能够方便地描述不相交的多个集合。 支持如下操作 1. 建立包含元素 x 的集合 MakeSet(x) 2. 查找给定元素所在的集合 Find(x), 返回所在集合的代表 3. 将两个不相交的集合合并 Union原创 2014-02-26 19:51:24 · 2535 阅读 · 2 评论 -
数据结构 《5》----二叉搜索树 ( Binary Search Tree )
本文分析了二叉搜索树的各种操作的具体实现。原创 2014-01-18 16:23:22 · 1726 阅读 · 0 评论 -
数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
本文给出了图的基于邻接表表示的实现。实现了DFS, BFS等图的基本操作。原创 2014-01-13 15:32:41 · 1959 阅读 · 0 评论 -
数据结构《1》---单链表
单链表各种操作的实现原创 2014-01-12 18:31:29 · 1750 阅读 · 0 评论 -
数据结构《9》----Threaded Binary Tree 线索二叉树
Definition:"A binary tree is threaded by making all right child pointers that would normally be null point to the inorder successor of the node, and all left child pointers that would normally be原创 2014-02-10 22:30:01 · 3498 阅读 · 5 评论 -
动手实现自己的 STL 容器 《1》---- vector
本文参考了侯捷的 《STL 源码分析》一书,出于兴趣,自行实现了简单的 vector 容器。之后会陆续上传 list, deque 等容器的代码,若有错误,欢迎留言指出。vector 容易实现的几点注意事项:1. 由于vector 是动态数组。出于效率的考虑,在往vector 中加入元素时,内存的扩展遵循的规则是: 1> 如果当前可用内存不够,开 2倍大的内存,将原原创 2014-04-11 15:58:11 · 3168 阅读 · 0 评论 -
数据结构 《3》----双向链表(带有头节点)
本文参照了 C与指针中双向链表的实现,力求简单明了。双向链表带有一个头节点, 头节点的pre指针指向链表的最后一个node; next指向第一个node; val 表示链表的长度。// copyright @ L.J.SHOU Jan.15, 2014// double-linked-list with a head node#i原创 2014-01-15 21:48:17 · 4031 阅读 · 1 评论