Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用字符串索引数组(C)_C_Arrays_String_Caching - Fatal编程技术网

用字符串索引数组(C)

用字符串索引数组(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] = .

我有一个无符号整数数组,每个整数对应一个包含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\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将检查每个字符串的索引,并根据相邻字符串索引的距离返回某个值

然后,我们可以比较各种计算指数的方法,找到一种最佳方法。
当然,我们可以先检查较短的字符串

如果以下假设适用于您的问题,则您实施的解决方案是最佳解决方案

  • 随机选择下一个字符串最右边的字符,每个有效字符的概率相等
  • 序列的开始并不总是相同的(它是随机的)
  • 原因: 当我第一次阅读你的问题时,我想到了下面的树:(为了简单起见,将你的问题缩减为三个字符长度的字符串,只有两个可能的字符A和B)注意,根节点最左边的子节点(在本例中为AAA)总是与根节点(AAA)相同,因此我不会进一步构建该分支

                          AAA
                         /  \
                            AAB       
                           /  \         
                         ABA    ABB
                        /  \    /   \ 
                     BAA   BAB  BBA  BBB
    
    在该树中,每个节点都有下一个可能的序列作为子节点要改进缓存,您需要使用广度优先遍历来遍历此树,并以相同的顺序将其存储在数组中。对于上面的树,我们得到以下字符串索引组合

    • AAA0
    • AAB 1
    • ABA 2
    • ABB 3
    • BAA 4
    • 婴儿5
    • 工商管理学士6
    • BBB 7
    假设值(A)=0,值(B)=1,则指数可计算为

    index = 2^0 * (value(string[2])) +  2^1 * (value(string[1])) + 2^2 * (value(string[0]))
    
    这与您正在使用的解决方案相同。 我已经编写了一个python脚本来检查其他组合(比如长度为4个字符的字符串,可能包含一个BC字符)


    因此,除非一开始所做的两个假设是错误的,否则您的解决方案已经考虑了缓存优化。

    一开始我误解了您的问题。你问的问题比我回答的问题有趣得多:-)当你说“提高我的缓存性能”时,你的测量速度是多少?内存消耗?@Philip:他指的是CPU缓存。显然,内存消耗将保持不变,但如果在时间上访问的元素接近内存,则处理数据的速度将快得多。@PhilipAdler速度是我主要关心的问题,但如果需要增加内存,当然内存应该在合理的范围内。这是您正在寻找的优化吗?