适应场景:
1,输入的数据限制在相对较小的范围内;2,数据没有重复;3,对于每条记录而言,除了单一整数外,没有任何其他相关联的数据。
2,要求
输入:一个最多包含n个正整数的文件F1,每个数小于n(n=1000000),而且整数没有重复;
输出:包含按升序排列的整数列表的文件F2;
约束:不超过1M的内存空间,运行时间10秒以内。
3,实现概要
可以用一个20位长度的0,1字符串来表示所有元素小于20的非负整数的集合。比如可以用下面的字符串来标示集合{1,2,3,5,8,13}:
S={0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 }
即S[1],S[2],S[3],S[5],S[8],S[13]都是1,其他的都是0.
利用上面的思想,可以用一个长度为n的字符串来表示文件F1里面的整数集合,然后遍历这个字符串,如果为1则输出下标的文件F2.
伪代码:
//初始化
for i=[0,n)
bit[i]=0;
//扫描输入文件
for each i in F1
bit[i]=1;
//输出
for each i=[0,n)
if bit[i]==1
write i to F2
我用java做了这个算法的实践,bit 数组采用的是JDK里面的BitSet,代码如下:
public static void main(String[] args) throws IOException {
int n = 10000000;
int k = 1000000;
String srcFile = "/tmp/in.dat";
String destFile = "/tmp/out.dat";
long start = System.currentTimeMillis();
genRandomNumbers2File(srcFile, n, k);
sortAndSave2File(srcFile, destFile, n);
long end = System.currentTimeMillis();
System.out.println("Done in " + (end - start) + " ms");
}
/**
* 在文件fileName中生成一个所有元素互异且位于[0,n)之间的随机排列的整数序列,序列长度为k
*
* @param fileName
* @param n
* @param k
* @throws IOException
*/
public static void genRandomNumbers2File(String fileName, int n, int k)
throws IOException {
File f = new File(fileName);
if (!f.exists()) {
f.createNewFile();
}
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(f));
int[] array = new int[n];// 定义初始数组
for (int i = 0; i < n; i++)
array[i] = i;
Random random = new Random();
for (int j = 0; j < k; j++) {
int index = j + random.nextInt(n - j);// 生成一个[j,n)之间的随机数,作为数组下标
// 交换array[j]和array[index],那么array[0..j]为已经获取到的随机数
int temp = array[index];
array[index] = array[j];
array[j] = temp;
// 把此次获取到的随机数存到rets里面
bos.write(temp);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bos != null) {
bos.close();
}
}
}
//从文件srcFile读取整数序列然后排序,并写到的destFile中
public static void sortAndSave2File(String srcFile, String destFile, int n)
throws IOException {
File fsrc = new File(srcFile);
File fdest = new File(destFile);
if (!fdest.exists()) {
fdest.createNewFile();
}
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(fsrc));
BitSet bs = new BitSet(n);
int read = 0;
while ((read = bis.read()) != -1) {
bs.set(read);
}
//
bos = new BufferedOutputStream(new FileOutputStream(fdest));
for (int i = 0; i < n; i++) {
if (bs.get(i)) {
// System.out.println(i);
bos.write(i);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bos != null) {
bos.close();
}
if (bis != null) {
bis.close();
}
}
}
此博客的算法思想来源于《编程珠玑(第二版)》第一章
分享到:
相关推荐
根据给定的文件信息,我们可以总结出以下关于“二分法排序算法C语言实现”的相关知识点: ### 1. 二分法搜索算法原理 二分法搜索算法,也称为折半查找算法,是一种在有序数组中查找特定元素的搜索算法。其基本思想...
这些排序算法是计算机科学中最基础且广泛使用的算法之一,它们在C++编程中具有重要的实践价值。 首先,MFC是一个C++库,它为开发Windows应用程序提供了类和函数。它基于面向对象的设计,使得开发者可以更容易地创建...
这个"C常用算法程序集"涵盖了这些算法的C语言实现,对于学习和实践C语言编程,提升算法思维能力,无疑是一个宝贵的资源库。通过深入理解和实践这些代码,开发者可以更好地掌握C语言的精髓,并为解决实际问题打下坚实...
这里的"能够自动排序的源代码适合初学者下载"是一个专门为DELPHI编程初学者设计的实践项目,它包含了一些实现排序功能的源代码,让学习者能够亲手操作和理解排序过程。 DELPHI是一种基于Object Pascal的可视化开发...
位图是一种用二进制数组表示集合的高效方法,常用于空间效率要求高的场景,如判断一个大整数集合中是否存在某个特定整数。 这些Java类文件展示了算法的实践应用,涵盖了数据结构、搜索策略和优化方法等多个方面。...
《Programming Pearls》(编程珠玑下载)第一章讲述了如何用位图排序无重复的数据集,整个思想很简洁,今天实践了下。 一、主要思想位图排序的思想就是在内存中申请一块连续的空间作为位图,初始时将位图的每一位都置...
《C常用算法程序集-徐士良》是一本专注于C语言实现常见算法的书籍,其源代码提供了丰富的学习素材,适合C和C++初学者以及对算法有深度探索需求的开发者。这本书涵盖了一系列基础和进阶的算法,旨在帮助读者理解和...
Java是一种广泛使用的编程语言,...同时,这也是一个很好的实践平台,可以动手修改代码,调整游戏规则,甚至添加新的功能,从而提升编程和算法设计能力。对于希望从事游戏开发的Java程序员来说,这是一个宝贵的资源库。
这个"数据结构与算法项目化教程"显然是一个教育资源包,旨在通过项目实践来教授这些核心概念。下面,我们将详细探讨每个章节可能涵盖的内容: 第1章通常会介绍基础知识,包括算法的基本概念,如时间复杂度和空间...
课程可能涵盖了排序算法(快速排序、归并排序、冒泡排序、插入排序)、查找算法(二分查找、哈希查找)、图算法(最短路径算法如Dijkstra、Floyd、Bellman-Ford)和动态规划等。这些算法的学习将提升分析和解决问题...
这些排序算法的不同之处在于它们的时间复杂度和空间复杂度,理解和掌握这些排序方法能帮助我们更好地优化程序性能。 2. **搜索算法**:如线性搜索、二分搜索、哈希搜索等。这些算法在处理大量数据时尤其有用,其中...
3. **Flood Fill**:洪水填充算法,常用于像素级的图形填充,从一个起始点开始,沿着相邻像素进行填充,直到整个区域被覆盖。但此算法不适合多边形填充,因为它无法处理孔洞和边界情况。 4. **扫描线剪切算法**:...
4. **优先级队列(Priority Queue)**:A*算法使用开放列表(通常是一个优先级队列)来存储待检查的节点,队列中的节点按其总代价(实际代价加启发式代价)排序。易语言提供了数据结构支持,可以创建这样的队列。 5...
- 计算资源是有限的,理解算法的限制是算法分析的一个重要方面。 - 随着数据规模的增加,算法的运行时间可能会变得不可接受,需要理解并分析这些限制。 14. **教学指导注释**: - 文档中提到,教科书的一些章节...
尽管这个程序可能还有改进的空间,但它提供了一个直观的实践平台,有助于学习者深入理解计算机图形学中的扫描线填充算法。通过分析、调试和优化这样的程序,可以提升对这个主题的理解,并为进一步探索计算机图形学的...
数据结构与算法是计算机科学的基础,对于理解和解决复杂...总的来说,"数据结构算法演示程序"是一个宝贵的教育资源,能够帮助学习者从理论到实践全面掌握数据结构和算法,为未来在计算机科学领域的发展打下坚实基础。
这个经典算法集合可能还包括其他算法,如排序算法(快速排序、归并排序)、查找算法(二分查找、哈希表查找)和图论算法(深度优先搜索、广度优先搜索)等,这些都是计算机科学和编程的基础知识,对于J2ME开发者来说...
这个压缩包中的"BAT-algorithms-master"可能是一个包含BAT(百度、阿里巴巴、腾讯)等公司面试题目的算法实践项目。通过这些资源,你可以系统地学习和练习这些重要的编程概念,提升你的编程技能,为面试或实际工作...
实现LRU需要记录每个页面的访问时间,并维护一个按访问时间排序的数据结构。当需要淘汰页面时,选择时间戳最早的页面。在实际操作中,由于完全记录所有页面的访问历史成本较高,通常会采用近似算法,如使用双向链表...