当前位置: 首页 > 知识库问答 >
问题:

在潜在不规则字符串/数组中查找最常见重复模式的算法

姚嘉容
2023-03-14

如果此问题重复了可用问题,则表示歉意。还没有找到一个正是我要找的。

我感兴趣的是检测字符串/数组中的模式,例如abcabc,在这些字符串/数组中,这些模式同样可以用整数编码。我的应用程序是这样的,我正在使用流式传感器,其中上述序列中的每个字母都是一个传感器(例如,A是一个传感器)。由于传感器故障等原因,我的序列并不总是非常定期/重复。由于各种故障,它们可能会像这样出现,例如bcabcabcaabcbca

我的应用程序变得更加困难,因为我事先不知道我的数据集中有多少个传感器,所以我需要一个算法来从序列中推断出那个数字(就像上面给出的那样)。唉,对于所有给定的示例,算法应该产生ABC,因为这是最长和最常见的模式。

我的一个想法是简单地说:

import numpy as np
from collections import Counter

# ABCABCABCABC encoded with integers 
A = np.array(
  [[ 1 ,2, 3],
   [ 1 ,2, 3],
   [ 1 ,2, 3],
   [ 1 ,2, 3]])

c = Counter(map(tuple, A)).most_common()[0]

# ((1,2,3), 4)

但这似乎效率很低,因为我必须多次(而且可能多次,因为我的序列很长,回想起来,我事先不知道重复序列的长度是3),然后每次运行计数器,以评估出现(或不出现)模式的规律性。

其他想法包括使用Knuth–Morris–Pratt算法以及n-grams或其组合。或者计算后缀树。

有更好的办法吗?

编辑

更多详情:

  • 数据大小:长度在1000到1000000 ish之间的序列(尽管上限不太可能)

共有1个答案

姬昀
2023-03-14

好的,所以我想出了这个,请尝试打破它。

from nltk import ngrams
from iteration_utilities import all_monotone

def find_longest_monotonic_increasing_ngram(seq):
    # Store stats
    gram_stats = {}
    # Find longest common subsequence / n-gram
    M = []
    for m in range(1,int(0.2*len(seq))):
        gram = Counter(ngrams(seq, m)).most_common()[0]
        # Check if gram is monotonically increasing (i.e. is it sorted)
        if all_monotone(gram[0],strict=True,decreasing=False):
            gram_stats[m] = gram
            M.append(m)

    return max([gram_stats[m][0] for m in M], key=len)

MWE:

A = np.tile([1,2,3], 30)
# Mess up
A = np.insert(A,0,[1,2]) # One missing sensor at t = start
A = np.append(A,1) # two missing sensors at t = final
A[50] = 2 # Missed sensor reading at t=50 
# Run
find_longest_monotonic_increasing_ngram(A)
>>> (1, 2, 3)
 类似资料:
  • 我正在寻找一种算法(可能是用Python实现的),能够找到字符串中最重复的序列。其中,对于重复,我指的是不间断地反复重复的任何字符组合(串联重复)。 我正在寻找的算法与“查找最常见的单词”的算法不同。事实上,重复块不需要是字符串中最常见的字(子字符串)。 例如: 不幸的是,我不知道如何解决这个问题。任何帮助都非常欢迎。 更新 有一个额外的例子来说明我希望返回重复次数最多的序列,不管它的基本构造块是

  • 好的,所以我查询DB并从IP地址列表生成一个数组: 返回的数组看起来像这样: 但是如果我想找到上面列表中的第一个或任何IP,出于某种原因,它什么也找不到: 我到底做错了什么?

  • 问题是,我试图这么做,但我检查字符串长度的方法不起作用;我能做些什么来修复它?

  • 问题内容: 有没有找到最常见的方法? 应该从该列表中找到单词“ test” 问题答案: 不要重新发明轮子,而要使用此类的方法: 返回指定集合中等于指定对象的元素数。更正式地,返回集合中元素e的数量,使得(o == null?e == null:o.equals(e))。 如果您需要 计算 所有元素的出现次数,请巧妙地使用Map并循环:)或将您的列表放在Set中,然后使用上述方法在set的每个元素上

  • 问题内容: 我需要找到表中的所有行,其中特定字段的字符串在两个或多个位置重复。 可以在MySQL语句中完成吗? 编辑 我需要获取每一行,而不仅仅是计数有多少重复项。我希望能够编辑这些字段。 问题答案: 是的,尝试这样的事情: