学渣乱搞系列之后缀数组 by 狂徒归来 后缀数组,其nlogn的构造方法,比较麻烦,十几个循环,基数排序?计数排序?各种排序,各种凌乱,学渣表示鸭梨很大啊!学渣从《挑战程序设计竞赛》中偷学了一点nlog2n的构造方法。字符串后缀(Suffix)是指从字符串的某个位置开始到其末...
分类:
其他好文 时间:
2014-08-23 12:30:30
阅读次数:
217
在前面三节排序算法中,我们分别分析了不同策略,思想用于排序,而这些算法都是基于数据间的比较来确定顺序的。假设我不用比较,换一种思路,那么就可以达到时间复杂度为O(n)的排序算法,当然是以付出额外的空间为代价的。一、基本思想线性时间排序的算法思想:(1):在计数排序中,利用比x小或等的元素个数和的来确...
分类:
其他好文 时间:
2014-08-21 00:00:53
阅读次数:
363
经典的排序算法有十种,分别是:选择排序、插入排序、希尔排序、冒泡排序、堆排序、合并排序、快速排序、计数排序、基数排序和桶排序。
下面对这些算法分类如下:
选择排序:简单选择排序、堆排序
插入排序:直接插入排序、二分插入排序、希尔排序
快速排序:快速排序、随机化快速排序
线性时间排序:计数排序、基数排序、桶排序
其他:冒泡排序、合并排序
这些排序排序算法的时间复杂度,稳...
分类:
其他好文 时间:
2014-08-20 16:31:32
阅读次数:
185
/*
* 算法导论 第八章 线性时间排序
* 计数排序、基数排序和桶排序
*/
#include
#include
#include
#include
using namespace std;
void printArray(int arr[], int len, char *str)
{
cout << str << endl;
for (int i=0; i<len; i...
分类:
其他好文 时间:
2014-08-12 00:46:13
阅读次数:
210
基础知识: 排序:通过计算机手段将一组随机无序的数列变成有序的数列。常用排序算法有很多,主要有如下的几种: 包括插入排序,冒泡排序,选择排序,堆排序,归并排序,计数排序,基数排序,桶排序,快速排序等。 插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对数组中的元素...
分类:
其他好文 时间:
2014-08-11 14:45:42
阅读次数:
282
题目描述:
如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,比如bad和adb即为兄弟字符串,现提供一个字符串,如何在字典中迅速找到它的兄弟字符串,请描述数据结构和查询过程。
思路一:用计数排序
设计一个数组,对单词每个字母计数加1,对兄弟单词每个字母计数减去1,如果最后这个数组的计数是0,那么就为兄弟单词
bool isBrotherWord(string &str1, s...
分类:
其他好文 时间:
2014-08-09 02:36:47
阅读次数:
255
计数排序是一个非基于比较的排序算法。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。计数排序的基本思想就是对于每一个输入元素x,确定出小于x的元素个数。有了这一信息就可以把x直接放到它在最终输出数组中的位置上。例如,如果有17个元素小于x...
分类:
其他好文 时间:
2014-08-08 17:37:56
阅读次数:
190
基本思想:
统计数组data,小于data[i]的个数为N,则把data[i]放在第N+1个位置上面。
实用范围:
所有数都在[0,max]范围内,max为数组的最大值,适用于max不是很大的情况。
对于数据2 5 3 0 2 3 0 3程序执行的过程如下图所示:
C++代码:
#include
using namespace...
分类:
其他好文 时间:
2014-08-08 16:09:56
阅读次数:
202