【问题标题】:Algorithm to count identical multisets of characters计算相同的多组字符的算法
【发布时间】:2020-07-05 23:24:22
【问题描述】:

我正在寻找一种快速(实际时间,而不是渐近复杂度)算法来计算相同的多组字符。比如输入

BCDEFGH
ABACD
BDCEF
BDCAA
DBACA
DABACA
DABAC
BCDEHFG

有4个相同的集合,即

ABACD
BDCAA
DBACA
DABAC

还有另外 2 个相同的集合

BCDEFGH
BCDEHFG

集合可以很大(>10,000 个字符)

我正在考虑使用散列,然后将其映射到计数器,但是我必须考虑如何在不进行排序的情况下有效地散列,以便重新排序的字符将映射到相同的散列。我想这样做的一种方法是计算每个字符在整数数组中出现的次数,然后对其进行哈希处理。

或者,是否有其他算法在实践中可能表现更好?也请告诉我任何加速提示和技巧

【问题讨论】:

  • 你想要什么输出格式?
  • 我想要一个相同集合计数的列表(任何格式),例如在示例中它将是 {4,2},以任何顺序

标签: string algorithm hash


【解决方案1】:

对于简化的字母表,正如您在示例中演示的那样,您可以使用 short[8] 的数组,并在该数组中计算集合中所有字符的存在。此后,散列该数组。请参见以下示例:

uint16_t arr[8];

bzero(arr, siezeof(arr)); // clear array before usage

for(int i = 0; i < setline.size(); i++) // fill swap-independent arr, O(N)
    arr[setline[i] - 'A']++;

// Hash the array
uint32_t h = 0xDEADBEEF;
for(int i = 0; i < 8; i++)
    h = ((h << 11) | (h >> (32 - 11))) + arr[i];

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多