
数据结构
草根学僧
意在记录自己的收获成果
展开
-
STL之set
首先要知道set是STL中的一种标准关联容器(例如set,map,multiset,multimap都是标准关联容器,而像vector,list,string,deque这些都是序列容器),那什么是关联式容器,什么又是序列容器呢? 关联容器与序列容器的区别在于:关联容器是通过键存储和读取元素的,而序列容器则是通过元素在容器中的位置顺序存储和访问元素的。 set特性: set的底层其原创 2017-02-16 12:13:49 · 431 阅读 · 0 评论 -
数据结构-直接插入排序与希尔排序
直接插入排序 原理: 每步将一个待排序的元素,按其排序码大小,插入到前面已经排好序的一组元素中的适当位置处,直到元素全部插入为止。(简单来说就是将无序区的元素,插入到有序区内,找到适当插入位置,并且将其后所有元素后移)实现步骤: 1>我们可以将第一个元素看作有序序列,将后面元素看作无序序列,从头到尾依次扫描未排序序列,给无序区的元素找到适当插入位置,将其位置后所有元素后移,然后流出空位进行插原创 2017-03-05 23:48:02 · 568 阅读 · 0 评论 -
每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
http://blog.youkuaiyun.com/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。 一致转载 2017-08-10 16:30:28 · 890 阅读 · 0 评论 -
C++实现单链表
花了点时间再次把单链表,以及相关各种操作函数实现了。#include<iostream>#include<assert.h>using namespace std;template<typename T>struct Node{ Node<T>* _next; T _value; Node(const T& value = T()) :_value(原创 2017-05-14 17:28:13 · 1043 阅读 · 0 评论 -
数据结构-AVL树
AVL树 AVL树又被称作高度平衡的二叉搜索树,是由两个俄罗斯数学家提出的。引入它是为了提高二叉搜索树的效率,减少树的平均搜索长度。什么是AVL树(性质)左子树和右子树的高度之差的绝对值不超过1树中的每个左子树和右子树都是AVL树每个节点都有一个平衡因子(balance factor–bf),任一节点的平衡因子是-1,0,1。 (每个节点的平衡因子等于右子树的高度减去左子 树的高度 )原创 2017-04-12 21:23:29 · 492 阅读 · 0 评论 -
数据结构-递归实现二叉树
二叉树: 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T原创 2017-02-17 12:19:52 · 634 阅读 · 0 评论 -
数据结构-选择排序以及对它的优化
选择排序 八大排序算法之一的选择排序,它的原理是比较容易理解的。 每一趟遍历都在后面元素中找到最小的元素(升序),记录它的下标,一趟走完后,如果记录的元素下标不等于这组元素第一个元素则进行交换。 我们可以配合图来看: 还另外加了升序和降序的仿函数,这样可以更加实用一些 下面是实现代码:template<class T>struct Less{ bool operator()(co原创 2017-03-06 11:51:03 · 611 阅读 · 1 评论 -
数据结构-堆(heap)
堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: a[i]<=a[2i+1]&&a[i]<=a[2i+2]或者a[i]>=a[2i+1]&&a>=key[2i+2] ,即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 大堆a[i]>=a[2i+1]&&a>=a[2i+2] 小堆 a[i]<=a[2i+1]&&a[i]<=a[2i+2] 由上述性质可知大堆的堆顶的关原创 2017-03-11 14:26:06 · 685 阅读 · 0 评论 -
数据结构-从归并排序到数组的逆序对数(微软面试题)
归并排序归并排序 与快速排序算法一样,归并排序也是基于分治法的。 就是将待排序的序列分成两个长度相同的序列,然后再对两个子序列拆分,一直到只剩下一个元素的子序列,为每个子序列排序,然后再将它们合并成一个有序序列。合并两个子序列的过程称为二路归并。 下面我们来看看原理图(逆序):下面是实现代码:#include<assert.h>using namespace std;//仿函数tem原创 2017-03-13 00:03:06 · 987 阅读 · 0 评论 -
数据结构-从计数排序到基数排序
加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl + Q 插入链接 Ctrl + L 插入代码 Ctrl + K 插入图片 Ctrl + G 提升标题 Ctrl + H 有序列表 Ctrl + O 无序列表 Ctrl + U 横线 Ctrl + R 撤销 Ctrl + Z 重做 Ctrl原创 2017-03-14 12:23:25 · 962 阅读 · 0 评论 -
数据结构-红黑树(RB-Tree)
红黑树的概念和性质红黑树是这样一颗二叉搜索树:树中的每个结点的颜色不是黑色就是红色。可以看作是一颗扩充二叉树。 特性描述如下: 特性1:根结点一定是黑色 特性2:没有连续的两个红色结点 特性3:所有从根结点到叶子结点的路径上都有相同数目的黑色结点 通过保持这三个性质从而使维持一颗红黑树的平衡。红黑书的结点enum COLOR{ BLACK, RED};//将结点原创 2017-03-22 21:13:29 · 885 阅读 · 0 评论 -
统计单词出现个数(STL-map求解)
string strs[] = { “zhangsan”, “zhangsan”, “lisi”, “wangwu”, “lisi”, “zhaoliu”,”lisi” }; 问题一:统计单词出现的次数 看到这个题,有很多思路可以解决,目前刚好在了解STLset/map中,所以就用map来解这个问题。 根据map的诸多借口可以有多种方法来解决这个问题,但是其实都是运用的ma原创 2017-02-16 22:53:43 · 4214 阅读 · 0 评论 -
数据结构-快速排序
快速排序是一种划分交换的方法,它采用分治法进行排序。 基本思想:任取待排序序列中的某个元素作为基准,按照该元素的排序码大小,将整个元素序列划分为左右两个序列:左边都小于基准元素,右边都大于或等于,基准元素在这两个序列中间,然后分别对这两个子序列重复上述操作,知道所有元素都排在相应位置为止。 我们可通过图来理解: 首先实现大的框架,递归的实现很简单就是首先对整个区间进快排,然后分成两个小区间原创 2017-03-09 13:29:09 · 595 阅读 · 0 评论