【发布时间】:2014-05-23 12:34:10
【问题描述】:
我有一个无符号整数数组,每个整数对应一个有 12 个字符的字符串,可以包含 4 个不同的字符,即“A”、“B”、“C”、“D”。因此该数组将包含 4^12 = 16777216 个元素。数组中元素的顺序是任意的;我可以选择哪个对应于每个字符串。到目前为止,我已经实现了这一点:
unsigned int my_array[16777216];
char my_string[12];
int index = string_to_index(my_string);
my_array[index] = ...;
string_to_index() 只是为每个字符分配 2 位,如下所示:
A --> 00, B --> 01, C --> 10, D --> 11
例如 ABCDABCDABCD 对应索引 (000110110001101100011011)2 = (1776411)10
但是,我知道一个事实是,用于访问数组的每个字符串都是前一个字符串向左移动一次,并带有一个新的最后一个字符。比如我用 ABCDABCDABCD 访问后,下一次访问将使用 BCDABCDABCDA,或者 BCDABCDABCDB,BCDABCDABCDC,BCDABCDABCDD。
所以我的问题是:
有没有更好的方法来实现 string_to_index 函数来考虑最后一个事实,以便连续访问的元素在数组中更接近?我希望通过这样做来提高我的缓存性能。
edit:可能我不是很清楚:我在找一个完全不同的字符串到索引对应的方案,让ABCDABCDABCD和BCDABCDABCDA的索引更接近。
【问题讨论】:
-
一开始我误解了你的问题。你问的问题比我回答的更有趣:-)
-
当您说“提高我的缓存性能”时,您的测量速度是多少?内存消耗?
-
@Philip:他指的是 CPU 缓存。显然内存消耗将保持不变,但如果及时访问的元素在内存中接近,则处理数据会快得多。
-
@PhilipAdler 速度是我主要关心的问题,当然如果需要增加内存应该在合理范围内
-
这是您正在寻找的 Memoization 优化吗?