数据结构和算法
文章平均质量分 79
rosepicker
这个作者很懒,什么都没留下…
展开
-
算法导论 堆排序
#include <stdio.h> #include <stdlib.h>//求左孩子下标 inline int Left(int i) { return i<<1; }//求右孩子下标 inline int Right(int i) { return (i<<1)+1; }//求父节点下标 inline int Parent(int i) { return i/2; }i原创 2015-04-01 16:17:58 · 405 阅读 · 0 评论 -
经典数据结构
红黑树 B树 B+树 R树 2-3-4树 K-d 树 树状数组 跳跃表 线段树 伸展树 单调队列 单调栈 一致哈希表 并查集 逆序对 环形缓存 双端队列 字典树 后缀树 后缀 数组 Trie树 AC自动机 折半枚举 分桶法和平方分割 堆 二项堆 斐波那契堆 Treap树堆 快速排序原创 2017-04-20 10:13:09 · 259 阅读 · 0 评论 -
分桶发和平方分割
分桶法(bucketmethod)是把一排物品或者平面分成桶,每个桶分别维护自己内部的信息,以达到高效计算的目的的方法。 其中,平方分割(sqrtdecomposition)是把排成一排的n个元素每根号n个分在一个桶内进行维护的方法的统称。这样的分割方法可以使对区间的操作的复杂度降至O(n*(1/2))。 和线段树一样,根据维护的数据不同,平方分割可以支持很多不同的操作。接下来原创 2017-05-22 16:28:04 · 301 阅读 · 0 评论 -
线段树
线段树原创 2017-04-19 16:09:41 · 138 阅读 · 0 评论 -
折半枚举
折半枚举不是一般的双向搜索,当问题的规模较大,无法枚举所有元素的组合,但能够枚举一半元素的组合,此时将问题拆成两半后分别枚举,再合并它们的结果这一方法往往非常有效。 POJ 2785: 给定各有n个整数的四个数列A,B,C,D。从每个数列中各取一个数,使四个数的和为0.当一个数列中有多个相同数字时,把它们作为不同的数字看待。求出这样的组合的个数。 void solve() {原创 2017-04-27 15:03:53 · 1044 阅读 · 1 评论 -
树状数组
平常我们经常会遇到一些对数组进行维护查询的操作,比较常见的如:修改某点的值,求某个区间的和。当数据规模不大的时候可以使用朴素方法,但当规模增大后是划不来的。而这两个操作正是树状数组的强项。 树状数组的结构如图所示: 从图中可以看出:c[1] = a[1] c[2] = a[1] + a[2] c[3] = a[3] c[4] = a[1] + a[2] + a[3] +原创 2017-04-27 09:27:20 · 172 阅读 · 0 评论 -
单调栈以及单调队列
栈就是后进先出的数据结构,而所谓单调栈就是栈内元素单调递增或者单调递减的栈。 单调栈具有以下性质: 1.单调栈内元素具有单调性 2.元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除 3.使用单调栈可以找到元素向左遍历的第一个比他小的元素,也可以找到元素向左遍历第一个比他大的元素 单调栈的最重要的就是第三个性质,我们来论证下: 1.当单调栈中的元素是单调递增的时候,可以原创 2017-04-25 16:19:54 · 428 阅读 · 0 评论 -
尺取法
尺取法是用于求解某一类问题的高效方法,该类问题就是在一组数据中找到不大于某一个上限的“最优连续子序列”。 例子:poj3061:http://poj.org/problem?id=3061 给定长度为n的数组和一个整数m,求综合不小于m的连续子序列的最小长度。这正是尺取法所适用的那一类问题。 以下为尺取法的查找思路: 以下为尺取法的核心代码: int l = 0,w原创 2017-05-15 16:57:28 · 224 阅读 · 0 评论 -
二分搜索
二分搜索法通常用来在有序数组中快速查找某值,但它的作用不仅仅就是这样,其在求最优解的问题上也非常有用。 让我们考虑一下“求满足某个条件C(x)最小的x”这一问题。对于任意满足C(x)的x,如果所有的x’ >= x 也满足C(x’)的话,我们就可以用二分搜索来球的最小的x。 首先将区间左端点初始化为不满足C(x)的值,右端点初始化为满足C(x)的值,每次取mid=(L+R)/2,原创 2017-05-24 17:06:07 · 164 阅读 · 0 评论 -
跳跃表
跳跃表原创 2017-04-19 16:10:07 · 198 阅读 · 0 评论 -
并查集
并查集是用来管理元素分组情况的数据结构,其具有以下性质: 1.高效查询元素a和元素b是否属于同一组 2.高效合并元素a和元素b所在分组 3.无法进行分割操作 并查集的最典型应用莫过于判断图的动态连通性,例如判断网络中两台电脑是否连接等,因此我需要对问题进行建模。 就动态连通性这个场景而言,我们需要解决的问题可能是: 给出两个节点,判断它们是否连通,如果连通,不需原创 2017-04-28 11:08:30 · 173 阅读 · 0 评论 -
对10^7数据量的磁盘文件排序
针对10^7的数据量的磁盘文件进行排序这个问题进行//生成实验所需要的不重复的10^7数据void dataFile() { int n; FILE *fp = fopen("data.txt","w"); assert(fp); for(n=1;n<=size;n++) { num[n] = n; } srand((unsigned)time(NULL)); int i,j原创 2015-05-07 18:50:13 · 311 阅读 · 0 评论 -
算法导论 二叉搜索树
二叉搜索树的结构不算复杂,就是删除结点有点复杂,需要注意#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; class Node { public: int key; Node* left; Node* right; No原创 2015-04-15 21:17:20 · 310 阅读 · 0 评论 -
算法导论 查找算法
二分查找是十分有效的查找算法,但它对数据的初始状态要求有效。如果我们对无序的数据进行排序,平均情况下最少O(nlogn),所以如果初始数据无序的话,二分查找平均情况下最少O(nlogn)。本文提出一个期望为线性时间的选择算法。它是一种分治算法(如同快速排序),渐线性运行时间为O(n)。它与快速排序一样,将输入数组进行递归划分,但它只处理划分的一边。#include <stdio.h> #includ原创 2015-04-20 11:22:00 · 465 阅读 · 0 评论 -
双向广度搜索
广度搜索是十分基本的搜索规则,就是从初始节点开始一层层扩展到目标节点,但它只能较好地解决状态不太多的问题,一旦搜索量巨大,往往会出现内存空间不够用的状况。双向广度搜索就是对广度搜索的改进,减少空间和时间上的复杂度。 有些问题按照广度搜索进行节点扩展,即适合逆序,也适合顺序,于是可以将单向搜索变为双向,初始节点向目标节点以及目标节点向初始节点,当两个扩展方向上出现同一个节点,搜索结束。原创 2017-05-22 14:43:48 · 458 阅读 · 0 评论