【问题标题】:Select the index which has the most number of prefixes among others?选择前缀数量最多的索引?
【发布时间】:2018-08-01 01:35:55
【问题描述】:

我有许多 0 和 1 的序列,我想找到具有最大数量的其他序列的序列,这些序列构成当前序列的前缀。

例子:

std::vector<std::vector<int>> sequence={{1,1},{1},{0,1,0,1},{1,1,0}}

{1,1} 只有 1 个前缀,即 {1}。

但是 {1,1,0} 有 2 个前缀 {1,1} 和 {1}。由于它具有最多的前缀计数,我想选择sequence. 的索引 3 我可以使用嵌套循环来完成它,但它会消耗大量时间,因为我必须处理大小为 512 的序列。感谢您的帮助。

到目前为止我做了什么:

bool isPrefixOf(std::vector<int> current, std::vector<int> other){
  if (other.size()>current.size())
      return false;
  for (int i=0; i<other.size(); ++i) {
      if (other[i] != current[i]) 
          return false;
    }
  return true; 
}

int len = sequence.size();
int max = 0;
int selected = -1;
int prefix_count;
for(int i=0; i<len; i++){
    prefix_count = 0;
    for(int j=0; j<len; j++){
      if(isPrefixOf(sequence[i],sequence[j])) ++prefix_count;
    }
    if(prefix_count >= max){
      max = prefix_count;
      selected = i;
    }
  }

【问题讨论】:

  • 你会有selected = i;,我。 e. index 您找到最大值的位置。
  • @Aconcagua 啊,真的。
  • 抱歉,一直没注意(这里是凌晨四点……)。

标签: c++ algorithm stdvector prefix


【解决方案1】:

您的双循环导致 O(n2) 算法。如果您构建prefix tree(在您的情况下为二进制),您可以获得一个 O(n) ,如下所示:

  • 对于每个单个序列,迭代值,在 0 上跟随左孩子,在 1 上跟随右孩子。如果不存在,则创建新的孩子。
  • 如果序列完成,则增加当前节点(无论是否为叶子!)。变体:如果您不想计算重复项,只需将节点值设置为 1(无论是否之前)。
  • 感兴趣的只有叶子,因为任何父节点都与叶子共享前缀,但它本身就是一个前缀,所以叶子将(至少)有一个前缀。
  • 对于每个叶子,总结从根到叶子的路径上的值。
  • 最大的叶子标记了你所追求的序列;你可以在计算总和时记住最大的权利,所以你不必走两次树

对于您给定的示例,树将如下所示:

      [0] (root, always 0)
     /   \
    /(0)  \(1)
   /       \
 [0]       [1] (one sequence finished here!)
   \         \
    \(1)      \(1)
     \         \
     [0]       [1]
     /          /
    /(0)       /(0)
   /          / 
 [0]        [1]<3>
   \
    \(1)
     \
     [1]<1>

在总和中包含叶子将正确考虑叶子中的重复项。这将包括形成叶子本身的路径的序列(解释:每个序列都是其自身的前缀),但由于 每个 叶子都是这种情况,因此您得到的偏移量为 1 ,所以这对你所追求的最大值没有影响......

您可以另外将通向节点的序列的索引存储在节点内,以便更快地访问原始向量。

【讨论】:

    猜你喜欢
    • 2018-11-21
    • 2013-03-13
    • 2022-08-03
    • 2021-09-08
    • 2020-04-16
    • 2021-06-12
    • 1970-01-01
    • 2017-08-27
    • 2015-10-10
    相关资源
    最近更新 更多