Не совсем понимаю логику этого вложенного цикла - не могу пересмотреть - PullRequest
0 голосов
/ 29 июня 2018

Я искал ранее отвеченные вопросы, касающиеся поиска повторяющихся подстрок в массиве, и наткнулся на https://cs.stackexchange.com/questions/79182/im-looking-for-an-algorithm-to-find-unknown-patterns-in-a-string. Он выполняет именно то, что мне нужно, за исключением того, что он анализирует одну строку (и находит повторы отдельных символов), тогда как Я хотел бы проанализировать массив (с целыми числами, некоторые превышающие 9). Я не могу сделать это с помощью кода как есть, потому что, например, «10» будет пониматься как «1» и «0».

Так что вместо примера "ABACBABAABBCBABA" я бы хотел проанализировать [A, B, A, C ...]. Более конкретно, я бы в конечном итоге захотел работать с целыми числами [1, 4, 3, 1, 4 ...]

Я пытался изменить код, однако я не думаю, что полностью понимаю логику вложенного цикла. Может ли кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 30 июня 2018

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

def countSubs(total, sub):
    totalCount = 0

    for i in range(len(total) - len(sub) + 1):
        testCount = 0

        for j in range(len(sub)):
            if sub[j] == total[i + j]:
                testCount += 1

        if testCount == len(sub):
            totalCount += 1

    return totalCount

minLength = 3
minCount = 2

test = [1,2,1,3,2,-1,2,-1,2,4,2,4,2,5,2,5,2,5,6,7,-1,7,-1,8,7,6,-1,9,-1,9,8,7,10]
rectDict = {}

for sublen in range(minLength, int(len(test)/minCount)):

    for i in range(0, len(test) - sublen):
        sub = test[i:i + sublen]
        cnt = countSubs(test, sub)

        #not necessary to concatenate with commas, but for visual legibility
        subText = ''.join(str(e) + ',' for e in sub)

        if cnt >= minCount and subText not in recDict:
            recDict[subText[:-1]] = cnt

print(rectDict)
...