数据结构和算法
文章平均质量分 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 · 303 阅读 · 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 · 1045 阅读 · 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 · 199 阅读 · 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 · 312 阅读 · 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 · 311 阅读 · 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 评论