在没有压缩等的情况下使用Python将1,000,000个int(0,1,2 ......)写入文件的最紧凑方法是什么?我的答案是:使用struct模块1,000,000 * 3个字节,但看起来像面试官期待的另一个答案......
编辑。以随机顺序从1到1,000,000的数字(因此在极少数情况下可以应用如5,6,7-> 5-7的变换)。您可以使用您知道的任何书写方法,但生成的文件应该具有最小尺寸。
答案 0 :(得分:4)
实际上,你可以做到超过2.5MB的A LOT,因为不是所有的订单都是可能的。有人可能会争辩说,击败5%会涉及压缩,因为一个人不会存储序列本身。基本上,您可能希望存储规范序列号。从0到7的8个数字以随机顺序通常需要24位(log(8^8)/log(2)
),但是对于规范序列号,它将需要16位(log(8!)/log(2)
)。
基本上,这涉及到提出一种算法,该算法可以将任何整数序列转换为一个巨大的数字。 8号序列的可能编号示例将按值排序:
01234567 : 0
01234576 : 1
01234657 : 2
01234675 : 3
01234756 : 4
01234765 : 5
...
此策略的费用为log(1000000!)/log(2)
(即log_2(1000000!)
)
标准解决方案的成本通常约为log(1000000^1000000)/log(2)
。
您还可以通过不同方式处理0000 0000 1111 1111
和1111 1111
来挤出更多空间,但这样做所节省的空间量非常小。
编辑:快速而肮脏的计算表明此优化会将尺寸降至约2.204MiB。
由于鸽子原则,我不相信有可能比这个策略更好,无论你是使用压缩技术还是其他技术。
答案 1 :(得分:2)
好吧,你的解决方案每个整数需要三个字节(= 24位)。从理论上讲,20比特就足够了(因为2 ^ 19 <1.000.000 <2 ^ 20)。
编辑:糟糕,刚刚注意到尼尔的评论同样如此。我正在回答CW,因为它真的属于他。答案 2 :(得分:2)
假设你必须记住它们的顺序并且数字在1到1,000,000的范围内,那么每个数字只需要20位或2½个字节,因为1,000,000是十六进制的0xF4240。你必须把它们打包在一起,不要用这种方法浪费任何空间,但这样做只需要2.5 * 1,000,000字节。
答案 3 :(得分:1)
f = open('numbers.dat', 'w')
f.write('list(range(1,1000000))')
f.close()
加载文件:
f = open('numbers.dat', 'r')
numbers = eval(f.read().strip())
f.close()
应该这样做。
实际上,我不明白为什么'python'在这里很重要。如果采访者担心结果文件的大小,则可以用任何语言编写解决方案。问题没有说明面试官是否需要紧凑的输出或紧凑的代码...
答案 4 :(得分:0)
我只会写出给定范围的开始和结束,在这种情况下为1和1,000,000,因为面试官提到的顺序很重要。
答案 5 :(得分:0)
What is the most compact way to write 1,000,000 ints (0, 1, 2...) to file using Python without zipping etc
如果您将1,000,000
整数解释为“我没有指定它们必须不同”,您只需使用for循环就可以写入0
一百万次。
答案 6 :(得分:0)
也许他们的意思是这样的 pythonic-way-to-convert-a-list-of-integers-into-a-string-of-comma-separated-range然后你说连续序列很少见,所以也许不是