数据结构
SmartBrave
这个作者很懒,什么都没留下…
展开
-
红黑树
当我们在使用二叉搜索树时,如果树的高度较高,对其的操作并不比对链表操作要快。原因是二叉搜索树在插入顺序基本有序时会退化为一个排序链表,所以说是不平衡的。对二叉搜索树的改进有AVL树和红黑树。先来看红黑树,它广泛应用在STL的set和map,Java库和Linux内核等中 。红黑树是一颗平衡的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是RED或BLANK。通过对任何一条从根节点到原创 2016-08-11 15:09:17 · 486 阅读 · 0 评论 -
一个简单的List实现
list和vector是STL库中两个最基本的容器,以下代码模拟实现一个简单的list:#ifndef _MYLIST_ #define _MYLIST_#include<iostream> using namespace std;class ListIsEmpty{}; class ArgIsIll{};template<typename T> class Node{ public: No原创 2016-08-11 15:43:10 · 785 阅读 · 0 评论 -
一个简单的Heap实现
以下代码实现了一个堆,可以传入仿函数来决定生成最大堆或最小堆。#ifndef _HEAP_ #define _HEAP_#include"../Vector/Vector.h" #include<string> using namespace std;template<typename T> class Less{ public: bool operator()(const T& t1,co原创 2016-08-11 15:42:09 · 779 阅读 · 0 评论 -
一个简单的Stack实现
stack的特性不用多说了吧,先进后出。底层可以用vector或list实现。#define _STACK_#include<iostream> #include"../List/MyList.h" using namespace std;class StackIsEmpty{};template<typename T> class MyStack{ public: MyStack():my原创 2016-08-11 15:41:00 · 1168 阅读 · 0 评论 -
一个简单的Deque实现
一个双向队列,底层使用list实现,因为list在push_back,push_front,pop_back,pop_front这些函数中效率较高。#ifndef _DEQUE_ #define _DEQUE_#include<iostream> #include"../List/MyList.h"template<typename T> class Deque{ public: Deque原创 2016-08-11 15:39:31 · 862 阅读 · 0 评论 -
一个简单的优先级队列实现
优先级队列底层使用堆来实现。因为堆可以在O(1)的时间内找出优先级最高的元素。 代码如下:#ifndef _PRIORITY_ #define _PRIORITY_#include<iostream> #include"../Heap/Heap.h" using namespace std;template<typename T,typename U> class PriorityQu原创 2016-08-11 15:37:59 · 1467 阅读 · 0 评论 -
一个简单的哈希表实现
哈希算法可以说是效率比较高的一种算法了,基本上时间复杂度为O(1)。但哈希有个坑爹的地方就是冲突的问题。当发生冲突时,有两种解决办法: * 线性探测 * 哈希桶法具体算法不再解释,以下代码使用STL中vector和list实现了一个基于哈希桶的哈希表。 代码如下:#pragma once#include<iostream> #include<vector> #include<list> usi原创 2016-08-11 15:36:33 · 913 阅读 · 0 评论 -
KMP算法
众所周知,KMP算法的作用是匹配字符串,比如在一个文本编辑器中查找符合某一模式的所有字符等。 就我认为,这个算法还是比较难的,反正我是看了好长时间都没懂,哈哈~ 昨天说了,每天一个算法,坚持下去! 今天看了《算法导论》中关于该算法的部分,对求next数组部分不是特别理解,参考了网上的某些文章,不过他这篇文章的分析确实不错,但代码部分有些缺陷,我已改正过来。简要记录如下:普通的暴力匹配算法是将模原创 2016-08-11 15:16:16 · 339 阅读 · 0 评论 -
一个简单的AVL树实现
上一篇文章实现了一个最简单的二叉搜索树,里面理由两个成员函数:插入和中序遍历。我觉得,插入应该算是BSTreet中最核心的一个函数了。 二叉搜索树虽然是一颗排序树,但当数据的插入顺序基本逆序时,BSTreet就退化为一个很近似链表的结构。而链表中查找的时间复杂度为O(n),显然这失去了二叉搜索树O(lgN)的优势。 因此我们可以对BSTree进行改进,使之成为一个平衡的二叉搜索树,即AVL树。原创 2016-08-11 15:22:29 · 812 阅读 · 0 评论 -
一个简单的二叉搜索树实现
上一篇文章简单实现了一个普通的二叉树,参见这里。 二叉搜索树是二叉树的一种变体,它相比普通二叉树的特性就是里面的数据都是有序的,中序遍历它就可以得到一个升序数组。BSTreet实现代码如下:#pragma onceinclude<iostream>using namespace std;template<typename T> struct BSTreeNode { T _data;原创 2016-08-11 15:23:20 · 1126 阅读 · 0 评论 -
一个简单的二叉树实现
众所周知,二叉树是一种很重要的数据结构,基于二叉树的哈夫曼树可用于文件压缩,BSTreet、AVLTree可用于排序,RBTree被广泛用在STL中的map,set等容器上和Java中的TreeSet和TreeMap上。 二叉树的节点结构:template<typename T> struct BinaryTreeNode { T _data; BinaryTreeNode<T>*原创 2016-08-11 15:24:09 · 1939 阅读 · 0 评论 -
冒泡排序
冒泡排序可以说是最简单的一种排序了,其核心思想是: * 每次比较相邻的两个数,若后面的比前面大,则交换之; * 重复以上步骤,直到所有数都有序为止。代码如下:template<typename T> void BubbleSort(vector<T>& v) { int length=v.size(); int i,j; for(i=0;i<length;++i)原创 2016-08-11 15:21:35 · 645 阅读 · 0 评论 -
选择排序
我个人认为冒泡排序和选择排序真是一对孪生兄弟,因为我总感觉这两个算法的思想很像,时间复杂度也相同。但其实他们的算法思想是不同的。冒泡排序是从前往后逐个比较相邻的元素,从而使得最大的元素”冒”到数组的最右边。 而选择排序则是将某一个元素与其余所有元素相比较,选出一个最小/最大的元素放在当前位置。 代码如下:template<typename T> void SelectSort(vector<T>原创 2016-08-11 15:20:47 · 428 阅读 · 0 评论 -
求给定数组的最大子数组
话说前天晚上被网易虐的也是够惨,3道编程题做出来两道,一个运行超时,一个通过率为70%。其实考的是动态规划之类的东西,只可惜我当时没有好好学。虽然牛客网服务器挂了导致考试延长一个小时,但这对我并没有什么实质帮助,不会还是不会呀。 今天开始啃《算法导论》,每天一个算法,坚持! 简单看了下分治这一节,照着书上的思想敲出了”给定数组的最大子数组”的代码,如下:int FindMidMaxSum(con原创 2016-08-11 15:17:34 · 545 阅读 · 0 评论 -
B树
B树是为磁盘或其他直接存取的辅助存取设备而设计的一种多叉平衡搜索树,类似于红黑树,但B树在降低磁盘I/O操作方面要更好一些。许多数据库系统使用B树或B树的变种来存储信息。 我们知道,磁盘I/O是很慢的,因为要涉及到磁头寻道、定址和数据读取时间。寻道是一种机械运动,速度自然慢;定址的平均时间是磁盘旋转周期的一半,目前主流磁盘旋转速度是5400RPM,快一点的也是7200RPM,尽管如此,旋转一圈需要原创 2016-08-11 15:06:36 · 365 阅读 · 0 评论 -
一个简单的Vector实现
众所周知,STL库以高效而闻名。而且使用它可以很方便的实现我们的主要逻辑,不需要关心各种底层的实现细节。本文模拟实现了一个简单的vector容器。关于vector的介绍请移步:浅谈STL。 代码如下:#ifndef _VECTOR_ #define _VECTOR_#include<iostream> #include<assert.h> #include<memory.h> using name原创 2016-08-11 15:44:14 · 1840 阅读 · 0 评论