将正32位整数转换为以null终止的字符串的查找表需要多少RAM

时间:2018-07-17 20:29:21

标签: c lookup-tables

因此,如果继续使用{"1","2","3"}格式直到4,294,967,295,将使用多少RAM?

2 个答案:

答案 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字节。