用字符串索引数组(C)
我有一个无符号整数数组,每个整数对应一个包含12个字符的字符串,可以包含4个不同的字符,即“a”、“B”、“C”、“D”。因此,数组将包含4^12=16777216个元素。数组中元素的顺序是任意的;我可以选择与每个字符串对应的字符串。到目前为止,我已经简单地实现了这一点:用字符串索引数组(C),c,arrays,string,caching,C,Arrays,String,Caching,我有一个无符号整数数组,每个整数对应一个包含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] = .
unsigned int my_array[16777216];
char my_string[12];
int index = string_to_index(my_string);
my_array[index] = ...;
string\u to\u index()
只需为每个字符分配2位,如下所示:
A-->00,B-->01,C-->10,D-->11
例如,ABCDABCDABCD对应于索引(0001011000110110001101101101)2=(1776411)10
然而,我知道一个事实,即用于访问数组的每个字符串都是前一个字符串,该字符串用新的最后一个字符向左移动了一次。例如,在我使用ABCDABCDABCDABCD进行访问后,下一次访问将使用BCDABCDA或BCDABCDB、BCDABCDB、BCDABCDC、BCDABCDD
所以我的问题是:
是否有更好的方法实现string\u to\u index
函数来考虑这最后一个事实,以便连续访问的元素在数组中更接近?我希望通过这样做来提高缓存性能
编辑:也许我不是很清楚:我正在寻找一个完全不同的字符串到索引对应方案,这样ABCDABCDABCDABCDABCDA和BCDABCCDABCDA的索引就更接近了。我想我们可以先定义“更接近”
例如,我们可以定义一个函数F,它采用一种计算字符串索引的方法。然后F将检查每个字符串的索引,并根据相邻字符串索引的距离返回某个值
然后,我们可以比较各种计算指数的方法,找到一种最佳方法。
当然,我们可以先检查较短的字符串 如果以下假设适用于您的问题,则您实施的解决方案是最佳解决方案
AAA
/ \
AAB
/ \
ABA ABB
/ \ / \
BAA BAB BBA BBB
在该树中,每个节点都有下一个可能的序列作为子节点要改进缓存,您需要使用广度优先遍历来遍历此树,并以相同的顺序将其存储在数组中。对于上面的树,我们得到以下字符串索引组合
- AAA0
- AAB 1
- ABA 2
- ABB 3
- BAA 4
- 婴儿5
- 工商管理学士6
- BBB 7
index = 2^0 * (value(string[2])) + 2^1 * (value(string[1])) + 2^2 * (value(string[0]))
这与您正在使用的解决方案相同。
我已经编写了一个python脚本来检查其他组合(比如长度为4个字符的字符串,可能包含一个BC字符)
因此,除非一开始所做的两个假设是错误的,否则您的解决方案已经考虑了缓存优化。一开始我误解了您的问题。你问的问题比我回答的问题有趣得多:-)当你说“提高我的缓存性能”时,你的测量速度是多少?内存消耗?@Philip:他指的是CPU缓存。显然,内存消耗将保持不变,但如果在时间上访问的元素接近内存,则处理数据的速度将快得多。@PhilipAdler速度是我主要关心的问题,但如果需要增加内存,当然内存应该在合理的范围内。这是您正在寻找的优化吗?