需求:
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);
}
}
说明:这个排序的速度很快,但是适合稠密的数据集合,不然会浪费很多内存。
分享到:
相关推荐
排序算法如冒泡排序、选择排序、插入排序、快速排序、归并排序等,将被详细分析,重点比较其时间复杂性和适用场景。 第七章通常会涵盖特殊的数据结构,如堆、散列、位图和优先队列。堆是一种可以快速找到最大或最小...
容器的数据结构,用于存储位向量,两侧快速附加,中间快速插入,所有这些都在简洁的空间中。 - 位片索引实验。 - 咆哮的位图。 - 基于咆哮位图的高性能OLAP。 - 基于 B 树数据结构的 C++ 内存容器。 - 快速、轻量级...
位片签名文件(Bitsliced signature files) 签名文件分析 位图 签名文件和位图的压缩 3.6 索引方法的比较 3.7 大小写折叠、词根化和停用词 大小写折叠 词根化 影响索引长度的因素 停用词(stop word) 3.8 进一步...
例如,快速排序和归并排序需要特定类型的数组结构。 在实际项目中,开发者可能需要结合多种数据结构,根据具体应用场景进行优化。例如,在文件系统设计中,可能会用到B树或B+树来存储文件的元数据,链表用于管理...
- **位图索引**:适用于基数较小的列,支持快速位运算和集合操作。 - **索引优化**:选择合适的索引字段和类型、定期维护索引以保持其效率、采用分区索引来提高大数据集的查询效率。 - **索引算法**:包括并发...
- **快速排序**:采用分治策略,选择一个基准元素进行分区操作,递归地对左右子数组进行排序。 - **归并排序**:同样基于分治法,将数组分成两半分别排序后再合并。 - **时间复杂度下界**:对于比较排序而言,下界为...
5.2 基于排序的倒排 256 5.3 索引压缩 261 压缩临时文件 261 多路归并 264 原地多路归并 265 5.4 压缩的内存内倒排.. 271 大内存倒排 271 基于字典的切分(Lexicon-based partitioning) 276 基于文本的切分...
- **简介**:一种基于C++实现的高效数据结构,用于存储比特向量,支持快速双向追加及中间插入操作。 - **特性**:空间紧凑,操作速度快。 - **应用场景**:适用于需要频繁访问比特级别的应用,如位图索引构建等。 *...
- **FM索引(FM-Index)**:FM索引是一种基于Burrows-Wheeler变换(BWT)的压缩文本索引,允许快速查询字符串并返回匹配结果。 - **波纹位图(Wavelet Tree)**:波纹位图是一种可以高效存储和操作多个数组的结构,...
`StereoMatch_RankTransform.cpp`可能包含了Census变换的实现,其中"Rank Transform"是一种加速Census变换的方法,它通过对像素邻域进行排序,减少了比较次数,提高了计算效率。 `Д.cpp`(可能是编码问题导致的...
- **位图索引**:用位向量记录索引属性中可能的值,适用于少量唯一值的情况。 - **索引管理**:建立与删除索引通常由数据库管理员或表的所有者负责。关系数据库管理系统会自动选择合适的索引进行查询优化,用户...