`
ol_beta
  • 浏览: 287064 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

基于位图、位向量的快速排序

阅读更多

需求:

1.需要就N位数字进行排序(N>5)

2.N位数是一个稠密的数字集合

3.集合中没有重复的元素(数字)

限制:

1.尽量减少内存使用

2.要求算法时间要短

 

先写一个工具类,生成稠密集合

import java.util.Date;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class InitArray
{
	public static Integer[] getArray(int nums)
	{
		int count=0;
		Random random = new Random(new Date().getTime());
		Set<Integer> set = new HashSet<Integer>();
		for(;count<nums;count++)
		{
			set.add((int)(random.nextFloat()*nums));
		}
		return set.toArray(new Integer[]{});
	}
}
 

排序实现

import java.util.Date;
public class BitMapSort
{
	//N 数字数量级
	public static int NUMS=1000;
	/**
	* Logger for this class
	*/
	private static final Log logger = LogFactory.getLog(BitMapSort.class);
	@SuppressWarnings("deprecation")
	public static Integer[] sort(Integer array[])
	{
		
		byte[] loop =new byte[NUMS];
		
		//置0 java默认为0
//		for(int i=0;i<NUMS;i++)
//		{
//			loop[i]=0;
//		}
		logger.info("--------------开始位向量排序--------------");
		Date begin = new Date();
		//将数据插入位图
		for(int j=0;j<array.length;j++)
		{
			loop[array[j]]=1;
		}
		//输出排序
		for(int j=0,k=0;k<NUMS;k++)
		{
			if(loop[k]==1)
			{
				array[j++]=k;
			}
		}
		Date end = new Date();
		logger.info("--------------位向量排序结束--------------");
		logger.info("--------------位向量排序耗时:"+(end.getMinutes()-begin.getMinutes())+"分钟 "+(end.getSeconds()-begin.getSeconds())+"秒--------------");
		return array;
	}
}
 

测试:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Main
{
	/**
	* Logger for this class
	*/
	private static final Log logger = LogFactory.getLog(Main.class);
	
	private static int NUMS=BitMapSort.NUMS;
	/**
	 * <b>main。</b>  
	 * <p><b>详细说明:</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param args
	 */
	public static void main(String[] args)
	{
		logger.info("--------------生存"+NUMS+"以内的稠密数组--------------");
		Integer array[] = InitArray.getArray(NUMS);
		logger.info("--------------生成完毕--------------");
		Integer arr1[] = BitMapSort.sort(array);
	}
}
 

 

说明:这个排序的速度很快,但是适合稠密的数据集合,不然会浪费很多内存。

分享到:
评论

相关推荐

    数据结构实用教程C++版(万健)课件

    排序算法如冒泡排序、选择排序、插入排序、快速排序、归并排序等,将被详细分析,重点比较其时间复杂性和适用场景。 第七章通常会涵盖特殊的数据结构,如堆、散列、位图和优先队列。堆是一种可以快速找到最大或最小...

    java笔试题算法-big-data-made-easy:大数据变得容易

    容器的数据结构,用于存储位向量,两侧快速附加,中间快速插入,所有这些都在简洁的空间中。 - 位片索引实验。 - 咆哮的位图。 - 基于咆哮位图的高性能OLAP。 - 基于 B 树数据结构的 C++ 内存容器。 - 快速、轻量级...

    深入搜索引擎--海量信息的压缩、索引和查询

    位片签名文件(Bitsliced signature files) 签名文件分析 位图 签名文件和位图的压缩 3.6 索引方法的比较 3.7 大小写折叠、词根化和停用词 大小写折叠 词根化 影响索引长度的因素 停用词(stop word) 3.8 进一步...

    嵌入式系统软件设计中的数据结构

    例如,快速排序和归并排序需要特定类型的数组结构。 在实际项目中,开发者可能需要结合多种数据结构,根据具体应用场景进行优化。例如,在文件系统设计中,可能会用到B树或B+树来存储文件的元数据,链表用于管理...

    高性能数据查询引擎.pptx

    - **位图索引**:适用于基数较小的列,支持快速位运算和集合操作。 - **索引优化**:选择合适的索引字段和类型、定期维护索引以保持其效率、采用分区索引来提高大数据集的查询效率。 - **索引算法**:包括并发...

    ACM所需小知识

    - **快速排序**:采用分治策略,选择一个基准元素进行分区操作,递归地对左右子数组进行排序。 - **归并排序**:同样基于分治法,将数组分成两半分别排序后再合并。 - **时间复杂度下界**:对于比较排序而言,下界为...

    Managing Gigabytes: Compressing and Indexing Documents and Images

    5.2 基于排序的倒排 256 5.3 索引压缩 261 压缩临时文件 261 多路归并 264 原地多路归并 265 5.4 压缩的内存内倒排.. 271 大内存倒排 271 基于字典的切分(Lexicon-based partitioning) 276 基于文本的切分...

    一堆大数据 常用的库和数据结构 资源

    - **简介**:一种基于C++实现的高效数据结构,用于存储比特向量,支持快速双向追加及中间插入操作。 - **特性**:空间紧凑,操作速度快。 - **应用场景**:适用于需要频繁访问比特级别的应用,如位图索引构建等。 *...

    sdsl-lite:简洁的数据结构库3.0(不稳定,预发布)

    - **FM索引(FM-Index)**:FM索引是一种基于Burrows-Wheeler变换(BWT)的压缩文本索引,允许快速查询字符串并返回匹配结果。 - **波纹位图(Wavelet Tree)**:波纹位图是一种可以高效存储和操作多个数组的结构,...

    census 立体匹配算法c++实现

    `StereoMatch_RankTransform.cpp`可能包含了Census变换的实现,其中"Rank Transform"是一种加速Census变换的方法,它通过对像素邻域进行排序,减少了比较次数,提高了计算效率。 `Д.cpp`(可能是编码问题导致的...

    关系数据库标准sql

    - **位图索引**:用位向量记录索引属性中可能的值,适用于少量唯一值的情况。 - **索引管理**:建立与删除索引通常由数据库管理员或表的所有者负责。关系数据库管理系统会自动选择合适的索引进行查询优化,用户...

Global site tag (gtag.js) - Google Analytics