活跃农民
- 积分
- 946
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-1-20
- 最后登录
- 1970-1-1
|
这种题没有标准答案,给你1年有1年的答法,20分钟有20分钟的答法。20分钟的话,就是看你能不能在短时间内发散思维,把以前学的东西瞬间应用在新场合上。
假设数组是32位int型数据,我能马上想到的方法有这些:
1.是用一个hashmap: {value->occurrence}来表示这个数组,相当于Run-length压缩法。这最适用于数组有大量重复数据的情况。如果没有重复数据,反而所用内存会变为原来的2倍。
2.是范围表示:比如[1 2 3 4 5 7 8 9 11 13]可以表示为[{1 5}, {7 9}, {11}, {13}],这适用于数据没有重复,但有大量连续的情况。
3.是类似于1和2的综合。先假设我们有一个大小是INT_MAX-INT_MIN的数组M,其中M[i]表示数字i在原数组A中出现的次数。比如当A = [1 2 2 3 4 5 5 7 8 9 11 11 13]时,M = [0 0 0 ..... 0 0 0 1 2 1 1 2 0 1 1 1 0 1 0 1 0 0 0 ... ],然后用Run-length法再压缩一次M。这个方法比1的好处是当大部分数字都不重复的话,也能获得较高的压缩率。
4. 比3再进一步。如果M中大部分值都是0或1。可以把这些数每32位一组pack到一个int中去。
补充内容 (2015-8-16 12:47):
请自行在斜体开始的地方脑补一个[ i ],我每次都忘记这件事。 |
|