因此,如果继续使用{"1","2","3"}
格式直到4,294,967,295,将使用多少RAM?
答案 0 :(得分:2)
让S( n )为数字 n 的字符串。
考虑S(429,496,730)至S(4,294,967,295)。通过将其划分为S(429,496,730)至S(999,999,999)和S(1,000,000,000)至S(4,294,967,295)子范围,我们可以看到它们需要(999,999,999−429,496,730 + 1)•10个字节和(4,294,967,295−1,000,000,000)•11个字节(九位数字为10个字节加一个空终止符,十个数字和一个终止符为11个字节。)
这是41,949,672,956字节。
考虑如何查找1到4,294,967,295之间的任何数字 n 。如果它在429,496,730到999,999,999范围内,则它的字符串开始( n −429,496,730)* 10字节进入上述第一个子范围的表中。如果高于该值,则它的字符串开始( n -1,000,000,000)•11个字节进入第二个子范围。
如果它小于429,496,730,我们只需将其添加1,000,000,000并查找S( n +1,000,000,000)。 S( n )的字符串从S( n +1,000,000,000)的第一个字节之后的第一个非零数字开始。
因此,我们已经证明,最多需要41,949,672,956字节来实现合理的查找功能,该功能可以轻松地返回指向1到4,294,967,295之间的任何整数的以空值结尾的字符串的指针。
此外,很容易看出,两个子范围的组合表中没有字符串是任何其他字符串的子字符串,这意味着需要每个字符串。因此,对于返回指向准备好的字符串的指针的函数来说,需要41,949,672,956字节,这是足够的。
答案 1 :(得分:0)
不知道这是一个“编程”问题(也不知道其答案为何有用),但是让我们尝试一下数学运算:
创建一个字符串指针表是不值得的,因为指针本身每个为8个字节,最长的字符串为10个字节(注意,不添加0终止符以节省空间!),因此最好存储它作为char [10]数组的数组(即,一个非常长的字符串,其第一个数字位于偏移量0处,第二个数字位于偏移量10处,依此类推)。因此,您需要2 ^ 31 * 10字节= 21,474,836,480字节。