编程珠玑 第一章 问题以及分析解答
来源:互联网 发布:有拼豆图纸的软件 编辑:程序博客网 时间:2024/05/17 01:11
编程珠玑的开篇就是讲了如何对大数据量的数据进行排序问题 - 比如 1000w的数的排序问题(美国的电话号码)
作者给出了以下思路
1)合并排序 -
也就是将数据都进来之后
2)多输入排序
3)位图排序
问题如下:
1.如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合?
Answer: java.utils.Array 提供了对简单数据类型的排序方法 Sort
如: int arr[] = {0,1,2.... n}
Array.sort(arr);
2.如何使用位逻辑运算(例如与、或、移位)来实现位向量
- public class BitSet {
- private int[] mBits;
- private int mSize;
- /**
- * 初始化指定个bit
- * @param size 初始化的bit数目
- */
- public BitSet(int size) {
- mSize = size;
- initBits();
- }
- /**
- * 将指定bit位置设为1
- * @param pos
- */
- public void set(int pos) {
- //得到此pos在数组中的索引
- int index = (int)Math.floor(pos/32f);
- //把当前整数的第n位设置为1
- mBits[index] = mBits[index] | (1<<(pos%32));
- }
- /**
- * 获取指定位是否存在
- * @param pos
- * @return
- */
- public boolean get(int pos) {
- int index = (int)Math.floor(pos/32f);
- return mBits[index] == (mBits[index] | 1<<(pos%32));
- }
- /**
- * 指定bit位置设为0
- * @param pos
- */
- public void reset(int pos) {
- int index = (int)Math.floor(pos/32f);
- //把当前整数的第n位设置为0
- mBits[index] = mBits[index] & ~(1<<(pos%32));
- }
- /**
- * 初始化整型数组
- */
- private void initBits() {
- //Java中整型为32位,所以数组长度为位长度/32。
- int count = (int) Math.ceil(mSize/32f);
- mBits = new int[count];
- clear();
- }
- /**
- * 清空,全部置零
- */
- private void clear() {
- int len = mBits.length;
- for(int index=0; index<len; index++) {
- mBits[index] = 0;
- }
- }
- }
3.如何生成一个包含K个整数的文件,要求这些整数都是唯一的,并且0到n-1中随机出现,次序也是随机的。
Answer:
这道题可以使用treap来生成-
1. 出现概率 -- 我们可以认为k个数的出现概率随机 - random(0,1)* ranmdom(0,1) -- 通过2次random,我们可以认为在10w这个量级上来说概率也随机了
2. 生成 K 个数 -- 我们将 0到 n-1 这n个数顺序读入,让后通过随机概率将这些数按照 Treap排列,即 P最大的那个数会成为 Root 节点,按照P成为一个堆,然后将其中前K个数字。
4.请在系统中用位图来实现并测试其运行速度。假设n=10000000,其中K=10000000;
Answer:
这道题可以使用上一篇博客的伪代码(具体实现稍后再作。)
6.如果某个整数出现的次数不是1次,而是10次,如何实现。
Answer: 之前的代码中,我们采用的是 1 bit 表示一个数,现在需要10次,可以将4个bit表示一个数,这样就可以通过这4个bit存储0 -15之内的所有次数。当然,最关键的就是 bit.set()和 bit.get()方法要重写。
7.程序缺陷 1) 如果重复,2)如果不是整数,3)如果是负数或者0,4)如果大于n,程序会如何处理?
Answer: 写程序要考虑的错误路径:) 这是写程序的最基本的考虑,你的代码是不是能正确的handle那些你不希望他出现的情况。嗯嗯,好好的改代码吧。
8. 美国有800,877,888这三个号段存储了免费号码,当然,这个号段还可能增加,请问如何才能1M的空间去排列所有的免费号码?
你如何存储一个免费号码集合以实施快速查找,从而确定给定的免费号码是可用还是已经被占用。
TBC....
- 编程珠玑 第一章 问题以及分析解答
- 编程珠玑 第一章习题解答
- 编程珠玑 第一章 习题解答
- 编程珠玑 第一章习题解答
- 编程珠玑第一章习题解答
- 编程珠玑——第一章习题解答
- 编程珠玑第一章,电话号码排序问题
- "编程珠玑" 第一章 磁盘文件排序问题
- 《编程珠玑》第一章读书笔记
- 编程珠玑-第一章
- 《编程珠玑》第一章笔记
- 编程珠玑第一章
- 编程珠玑第一章补充
- 【编程珠玑】第一章 开篇
- 【编程珠玑】第一章 开篇
- 编程珠玑 第一章解析
- 编程珠玑第一章
- 编程珠玑 第一章 开篇
- S5PV210支持DM9000驱动(Android2.2)
- 函数可变参数
- 二八定律
- IMG ONLOAD 事件加载程序
- Add Google Admob in Android Application
- 编程珠玑 第一章 问题以及分析解答
- 2011年6月30日
- GCC/G++ 编译器入门
- 从缓冲区中加载BMP位图并返回句柄
- 站在窗口的时候
- java的文件操作注意事项
- Makefile 基础
- 三句话讲清楚SOA
- 关于3dmax用熊猫插件导出的问题