Подтвердить что ты не робот

Поиск шаблонов в списке

В настоящее время я ищу способ поиска шаблонов в списке целых чисел, но метод, который я собираюсь использовать, применим к строкам и другим спискам с разными элементами, конечно. Теперь позвольте мне объяснить, что я ищу.

Я хочу найти самый длинный повторяющийся шаблон в списке целых чисел. Например,

[1, 2, 3, 4, 1, 2, 3]
# This list would give 1, 2, 3

Перекрывающиеся шаблоны должны быть отброшены. (Не определенно)

[1, 1, 1, 1, 1]
# Should give 1, 1  Not 1, 1, 1, 1

Вот что мне не помогло.

Поиск шаблонов в списке (Не понял логику первого ответа, очень мало объяснений. И второй ответ решает проблему только в том случае, если шаблон известен до решение.)

Поиск целочисленного шаблона из списка (Шаблон задан и требуется количество вхождений. Отличается от моего вопроса.)

Самая длинная общая проблема подпоследовательности (Большинство людей занимались этой проблемой, однако она не близка мне. Мне нужны последовательные элементы при поиске Однако в этом отдельные элементы также учитываются как подпоследовательности.)

Вот что я пробовал.

def pattern(seq):
    n = len(seq)
    c = defaultdict(int) # Counts of each subsequence
    for i in xrange(n):
        for j in xrange(i + 1, min(n, n / 2 + i)): 
            # Used n / 2 because I figured if a pattern is being searched
            # It cant be longer that the half of the list.
            c[tuple(seq[i:j])] += 1      
    return c

Как вы видите, он находит все подсписки и проверяет повторы. Я нашел этот подход немного наивным (и неэффективным), и мне нужен лучший способ. Пожалуйста, помогите мне. Спасибо заранее.

Примечание1: Список предопределен, но из-за отказа моих алгоритмов я могу только проверить некоторые части списка перед замораживанием компьютера. Таким образом, шаблон, который я пытаюсь найти, может быть намного длиннее половины списка поиска. Он может даже быть длиннее самого списка поиска, потому что я ищу только часть исходного списка. Если вы представляете лучший метод, чем Я использую, я могу искать большую часть исходного списка, поэтому у меня будет больше шансов найти шаблон. (Если он есть.)

Примечание2: Вот часть списка, если вы хотите протестировать его самостоятельно. Кажется, что есть шаблон, но я не могу быть уверен, прежде чем тестировать его с помощью надежного кода. Пример списка

Примечание3: Я рассматриваю это как серьезную проблему интеллектуального анализа данных. И попробуем узнать, если вы сделаете длинное объяснение. Это похоже на гораздо более важную проблему, чем LCS, однако LCS гораздо более популярен: D Этот метод, который я пытаюсь найти, похож на методы, которые ученые используют для поиска ДНК-образцов.

4b9b3361

Ответ 1

Код

Игнорируя требование "не перекрывать", здесь код, который я использовал:

def pattern(seq):
        storage = {}
        for length in range(1,len(seq)/2+1):
                valid_strings = {}
                for start in range(0,len(seq)-length+1):
                        valid_strings[start] = tuple(seq[start:start+length])
                candidates = set(valid_strings.values())
                if len(candidates) != len(valid_strings.values()):
                        print "Pattern found for " + str(length)
                        storage = valid_strings
                else:
                        print "No pattern found for " + str(length)
                        return set(filter(lambda x: storage.values().count(x) > 1, storage.values()))
        return storage

Используя это, я нашел 8 разных шаблонов длиной 303 в вашем наборе данных. Программа также работала довольно быстро.

Версия псевдокода

define patterns(sequence):
    list_of_substrings = {}
    for each valid length:  ### i.e. lengths from 1 to half the list length
        generate a dictionary my_dict of all sub-lists of size length
        if there are repeats:
            list_of_substrings = my_dict
        else:
            return all repeated values in list_of_substrings
    return list_of_substrings  #### returns {} when there are no patterns