`
steeven
  • 浏览: 312984 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

瞎掰一个效率最高的整数排序算法,bitmap排序,时间复杂度O(n)

阅读更多
先上结果,速度上秒掉各种排序:
1e4 Straight Insertion: 0.109916 Sec
1e4 Bitmap sorting    : 0.000214 Sec
1e8 Bitmap sorting    : 6.568575 Sec

前提条件是一般测试数据偏差不大,因此可以用bitmap来标记数据,标记完了自然就排序完成。比堆排序还要快一两个数量级。
缺点也很明显:占内存,只能使用不是特别多的数据排序。
内存评估:一字节8bit, 1M内存是8M bitmap, 1G内存可以排序偏差为8e9的数据,所以一般开发时如果内存够用可以快速出结果。上面1e8个随机数,生成的时候取值在1e9之内,所以内存占用125M.

实现:先扫描出最大最小值,然后分配bitmap内存,再扫描一次做标记,完工。复杂度应该是O(n)

参考:各种排序1万条随机数对比:https://wenku.baidu.com/view/65a02500168884868662d637.html

int *bitmap_sort(int *d, int n, int *r_min, int *r_count) {
	//first scan find min and max
	//create bitmap, size(max-min)
	//2nd scan map existance of each number
	int i;
	int min = d[0];
	int max = d[0];

	for (i = 1; i < n; ++i) {
		if (d[i] < min)
			min = d[i];
		else if (d[i] > max)
			max = d[i];
	}

	int int_bits = sizeof(int) * 8;
	*r_min = min;
	*r_count = (max - min + 1) / int_bits + 1;
	int *bitmap = (int *) calloc(int_bits, *r_count);
	for (i = 0; i < n; ++i) {
		int idx = d[i] - min;
		bitmap[idx / int_bits] |= 1 << (idx % int_bits);
	}
	return bitmap;
}

void bitmap_dump(int min, int count, int* bitmap) {
	int i, j, v;
	int idx = 0;
	for (i = 0; i < count; ++i) {
		v = bitmap[i];
		for (j = 0; j < sizeof(int) * 8; ++j) {
			if (v & (1 << j)) {
				if (idx % 50 == 49)
					printf("\n");
				printf("%d ", min + i * sizeof(int) * 8 + j);
				idx++;
			}
		}
	}
	printf("\n");
}

void bitmap_sort_test(int n, int* d) {
	clock_t start;
	int min, count;
	int* bitmap;

	if (n < 1000)
		bitmap_dump(min, count, bitmap);

	start = clock();

	bitmap = bitmap_sort(d, n, &min, &count);

	printf("Bitmap Sort total time: %f\n",
			(clock() - (double) start) / CLOCKS_PER_SEC);

	if (n < 1000)
		bitmap_dump(min, count, bitmap);
}

int main(int argc, char **argv) {
	clock_t start;
//	int d[] = { 2, 5, 9, 3, 4 };
//	int n = sizeof(d) / sizeof(d[0]);

	int n = 1e8;
	int *d = (int *) malloc(n * sizeof(int));
	if (!d) {
		printf("not enough memory\n");
		return -1;
	}

	make_random_data(d, n);

	if (n <= 1e5) {
		if (n < 1000)
			dump_data(d, n, 0);
		start = clock();
		straight_insertion_sort(d, n);
		printf("Straight Insertion total time: %f\n",
				(clock() - (double) start) / CLOCKS_PER_SEC);
		if (n < 1000)
			dump_data(d, n, 1);
	}

	bitmap_sort_test(n, d);

	return EXIT_SUCCESS;
}
分享到:
评论
1 楼 steeven 2017-03-28  
后记,网上一搜,这个算法有人贴过。再仔细看看其他算法,这就是统计排序的特例,重复为1才可以用bitmap

另外设想过,俩俩排序,然后上升到四个四个排序,因为排序过的两组合并很快。很不幸发现这是归并排序。。。

然而算法还是很好玩的,比较排序基于cpu的弱项,只能逐个比较。如果不用cpu,搜索最快的就是tcam。排序是不是可以用fpga什么的,让数据自行交换,并行执行。如果矩阵之间数据自行移动,复杂度就是定点到定点, O(sqrt(N))? 终于看到比O(N)小的排序方法 如果三维四维甚至多维。。。硬件工程师要撞墙了。。。

相关推荐

    位图数据结构在排序算法中的应用.pdf

    位图排序算法的优势在于其时间复杂度为O(n),在内存开销方面,位图排序只需要足够的位数来表示数据集合中所有可能的值。不过,这种方法在某些情况下仍然存在限制,例如当输入文件中的整数范围非常大时,可能需要超过...

    java排序算法使用及场景说明

    Java 排序算法使用及场景说明 本文档主要介绍了 Java 排序算法的使用和场景说明,包括了五个实践场景的解决方案。 Scenario 1: 找出两个文件共同的 URL 在这个场景中,我们有两个文件 a 和 b,每个文件中存放了 ...

    c# 实现位图算法(BitMap)

    BitMap 的基本思想就是用一个 bit 位来标记某个元素对应的 Value,而 Key 即是该元素。由于采用了 Bit 为单位来存储数据,因此可以大大节省存储空间。BitMap 可以看成一种数据结构,广泛应用于大量数据的存储和查询...

    百度、谷歌、腾讯、微软数据结构算法面试题

    1. 时间复杂度与空间复杂度分析:题目中提到的时间复杂度问题,通常是要求计算一个算法运行时间的增长速率。例如,如果每个操作需要1/12秒,每秒执行60次操作,那么要执行720次操作需要的时间是720/(1-1/12) = 720 *...

    大数据处理算法.pdf

    Bitmap 算法是一种常用的大数据处理算法,主要用于判断某个元素是否存在于一个大规模数据集中。该算法的核心思想是使用每一位来存放某种状态,适用于大规模数据但数据状态又不是很多的情况。 例如,要判断一千万...

    Bitmap大数据查找算法

    `Debug`目录可能包含了编译后的调试版本程序,而没有扩展名的`大数据过滤算法-Bitmap`可能是一个源代码文件或者项目中的另一个组件。 学习和理解Bitmap大数据查找算法,有助于提升在大数据处理场景下的性能优化能力...

    【保证工作用的上】趣味数据结构与算法

    给出了一些算法的实际应用,比如在给定一个乱序数组和一个元素,将数组分成两部分。这个问题和快速排序算法中的partition操作类似,是面试中常见的算法题,也反映了算法在工作中的实用价值。 通过这些知识点,我们...

    Bitmap 结构在高性能网络算法设计中的应用

    对于一个包含n个元素的集合,我们可以用一个长度为n的比特数组来表示这个集合,其中每个比特位对应集合中的一个元素,如果该元素存在,则相应的比特位置为1;如果不存在,则置为0。这样,一个庞大的集合就可以被压缩...

    linux系统的O(1)调度算法

    Linux系统的O(1)调度算法,也称为常数时间调度,是Linux内核2.6版本引入的一种高效调度策略,其目标是在任何情况下都能在固定的时间内选择出优先级最高的进程进行执行,无论系统中存在多少个可运行的进程。这种算法...

    程序员编程艺术:面试和算法心得.pdf

    • 第六章 海量数据处理 o 6.0 本章导读 o 6.1 关联式容器 o 6.2 分而治之 o 6.3 simhash 算法 o 6.4 外排序 o 6.5 MapReduce o 6.6 多层划分 o 6.7 Bitmap o 6.8 Bloom filter o 6.9 Trie 树 o 6.10 数据库 o 6.11 ...

    Integrating+BitMap+Structure+deeply+inside+ClickHouse.pdf

    此外,查找复杂度在BitMap中可以达到常数时间O(1),远优于一般数组的线性时间O(n)。在数据集合的交、并、差运算中,BitMap同样表现出色,能快速执行IN/JOIN、UNION、NOT IN等操作。 在具体应用中,BitMap常见于人群...

    论文研究-Bitmap结构在高性能网络算法设计中的应用.pdf

    基于Bitmap数据结构的数据压缩技术是一种针对线性存储结构的有效压缩方法,虽被广泛用于网络处理的多个领域(路由查找、网包分类等),却一直缺乏深入的分析。给出了Bitmap结构能提高算法空间性能的理论根据。总结了...

    面试常见基础算法题总结

    1. **红黑树**:红黑树是一种自平衡二叉查找树,它保持了二叉搜索树的特性,同时通过特定的规则确保了操作的平均时间复杂度为O(log n)。红黑树广泛应用于STL的map和set中,Java的TreeMap等。AVL树和红黑树在不同场景...

    《编程之法:面试和算法心得1》数据结构

    例如,旋转字符串问题要求在保持字符串原地不变的情况下,将前若干个字符移动到字符串末尾,要求时间复杂度为O(n),空间复杂度为O(1)。书中提供了两种解法,一是暴力移位法,虽然简单易懂但时间复杂度过高;二是三步...

    Bitmap 性能和原理研究.docx

    EWAH 算法是 WAH 算法的改进版本,它在 WAH 算法的基础上增加了一个 Header,作为元信息的存储。 EWAH 算法可以更好地存储和查询数据,提高了查询效率。 CONCISE(Compressed N Composble Integer Set)算法 ...

    7. BitMap-小小的身躯蕴含着大大的能量1

    Bitmap,也被称为位映射,是一种高效的数据结构,尤其在处理大数据时,它能节省大量存储空间。在Java中,Bitmap常用于存储大量的布尔值,...在适当的应用场景下,Bitmap是一个高效的工具,能提供出色的性能和空间效率。

    层压缩树包分类算法研究.pdf

    算法的时间复杂度为O(dN),其中d表示数据包头部的域数量,N是规则的数量。在规则数量较小(例如少于5000条)的情况下,该算法能够每秒处理接近2M个包头,展现出极高的分类速度。此外,层压缩树算法的空间复杂度为O...

    算法java实现

    位图是一种用二进制数组表示集合的高效方法,常用于空间效率要求高的场景,如判断一个大整数集合中是否存在某个特定整数。 这些Java类文件展示了算法的实践应用,涵盖了数据结构、搜索策略和优化方法等多个方面。...

    android 把一个view视图转换成bitmap 保存到本地

    1. **创建Bitmap对象**:`Bitmap.createBitmap()`方法用于创建一个新的Bitmap,参数分别是宽度、高度和颜色格式。我们通常使用`View`的测量尺寸(`getMeasuredWidth()`和`getMeasuredHeight()`)来确定Bitmap的大小...

Global site tag (gtag.js) - Google Analytics