【问题标题】:Indexing an array with a string (C)用字符串索引数组 (C)
【发布时间】: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 优化吗?

标签: c arrays string caching


【解决方案1】:

如果以下假设对您的问题是正确的,那么您实施的解决方案是最好的。

  1. 下一个字符串最右边的字符是随机选择的,每个有效字符的概率相等
  2. 序列的开始并不总是相同(它是随机的)。

原因: 当我第一次阅读您的问题时,我想出了以下树:(为简单起见,将您的问题简化为长度为三个字符的字符串,并且只有 2 个可能的字符 A 和 B)请注意,根节点的最左侧子节点(在本例中为 AAA)是始终与根节点 (AAA) 相同,因此我不会进一步构建该分支。

                      AAA
                     /  \
                        AAB       
                       /  \         
                     ABA    ABB
                    /  \    /   \ 
                 BAA   BAB  BBA  BBB

在这棵树中,每个节点都有其下一个可能的序列作为子节点。 为了提高缓存,您需要使用广度优先遍历这棵树,并以相同的顺序将其存储在数组中。 对于上面的树,我们得到以下字符串索引组合。

  • AAA 0
  • AAB 1
  • ABA 2
  • ABB 3
  • BAA 4
  • BAB 5
  • BBA 6
  • BBB 7

假设value(A) = 0,value(B) = 1,index可以计算为

index = 2^0 * (value(string[2])) +  2^1 * (value(string[1])) + 2^2 * (value(string[0]))

这与您使用的解决方案相同。 我已经编写了一个 python 脚本来检查这个是否有其他组合(比如长度为 4 个字符的字符串,可能的字符是 A B C)。 Script link

因此,除非一开始的 2 个假设是错误的,否则您的解决方案已经负责缓存优化。

【讨论】:

    【解决方案2】:

    我认为我们可以先定义“更接近”。

    例如,我们可以定义一个函数 F,它采用一种计算字符串索引的方法。然后 F 将检查每个字符串的索引,并根据相邻字符串索引的距离返回某个值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 2014-03-02
      • 1970-01-01
      • 2015-03-03
      • 2016-04-05
      相关资源
      最近更新 更多