Можете ли вы объяснить мне код алгоритма RLE в python?

Я, наконец, нашел, как создать алгоритм RLE, посмотрев учебник, но этот учебник не объяснил что-то в этом коде, я не понял, почему мы пишем j = i вместо j = 0 (зная, что я = 0) это же нет?

Я тоже не понял, почему i = j + 1. Почему i = j + 1 В конце функции? Почему бы не просто i += 1, но если мы хотим повторить цикл в цикле, мы делаем j + 1?

Должен ли первый цикл while повторять второй цикл while до тех пор, пока строка не будет завершена?

И, наконец, почему encoded_message повторяется два раза? вместо одного. Мы возвращаем encoded_message, вот и все? Мы можем просто выполнить print(encode(text)) вместо "print('Закодированное сообщение является выходом',encoded_message)" (когда мы помещаем encode(text) в encoded_message)

Я знаю, что задаю много вопросов, но я просто не могу запомнить код, не понимая его, это было бы совершенно бесполезно и непродуктивно.

    def encode(message):
        
        encoded_message = ""
        i = 0
        while(i<len(message)):
            count = 1
            ch = message[i]
            j = i # ???
            while(j<len(message)-1): # GET IT -----------------------------------------------------------
                if message[j] == message[j+1]: # if the previous and next characters are the same 
                    
                    count = count + 1 # we increase count variable
                    j += 1 # we increase j position
                    # GET IT ----------------------------------------------------------------------------
                else:
                    break
                
            encoded_message = encoded_message + str(count) + ch # "" + count converted to string + character (ch)
            i = j + 1 # ???
        return encoded_message


text = input('enter your charcter chain...')
encoded_message = encode(text)
print('The encoded message is the output ',encoded_message)

Когда я заменил j = i на j = 0, в терминале ничего не отображается

см.: безрезультатно

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть внешняя петля и внутренняя петля. Внешний цикл с переменной i начинает перебирать сообщение. Внутренний цикл использует переменную j и начинается с текущей позиции i.

То есть: когда i=0, то j=0. Но когда i=5 (например) то j=5 тоже.

Задача внутренних циклов — проверить, следуют ли друг за другом 2 или более одинаковых символа. Если да, то i соответственно увеличивается в конце внутреннего цикла. Так что каждая буква сообщения просматривается только один раз.

Вот почему j не следует устанавливать на постоянное значение. Установка его на j=0 приведет к тому, что внутренний цикл будет начинаться с начала сообщения на каждой итерации.

Я добавил два простых оператора print() в ваш код, чтобы уточнить:

def encode(message):
     encoded_message = ""
     i = 0
     while(i<len(message)):
         print(f'outer loop: i = {i}')
         count = 1
         ch = message[i]
         j = i
         while(j<len(message)-1):
             print(f'\tinner loop: j = {j}')
             if message[j] == message[j+1]: # if the previous and next characters are the same 
                 count = count + 1 # we increase count variable
                 j += 1 # we increase j position
             else:
                 break
             
         encoded_message = encoded_message + str(count) + ch # "" + count converted to string + character (ch)
         i = j + 1
     return encoded_message


text = 'Hello World'
encoded_message = encode(text)
print('The encoded message is the output ', encoded_message)

(Обратите внимание: я не знаю алгоритм RLE, но только что посмотрел ваш код.)

Хорошо, теперь это более ясно, но для i = j + 1 для i соответственно увеличивается в конце внутреннего цикла, верно?

MrTiredVeryTired 07.05.2022 03:18

Да, это правильно.

rosa b. 07.05.2022 08:19

Но мы могли бы написать i += 1 вместо no ?

MrTiredVeryTired 07.05.2022 10:01

Использование i+=1 допустимо, если входное слово не содержит одинаковых последовательных букв. Но опять же внутренний цикл вообще не нужен... так как его единственная задача состоит в том, чтобы суммировать эти одинаковые последовательные буквы. Просто используйте `aaa` в качестве входных данных и проверьте, что происходит при использовании i=j+1 по сравнению с i+=1.

rosa b. 07.05.2022 10:40

Хорошо, спасибо за объяснение, у меня только два последних вопроса. Вы не возражаете?

MrTiredVeryTired 09.05.2022 04:34

Каково на самом деле реальное значение i = j + 1, это похоже на то, что i увеличивается, когда внутренний цикл увеличивается на 1 элемент вместо увеличения внешнего цикла на 1 (i = i + 1). И последнее, как символ, например, с «aaa ' почему в результате мы получили 3а вместо 1а2а3а ?

MrTiredVeryTired 09.05.2022 04:49

Обратите внимание, что я правильно понимаю вопросы. Но я попробую: (1/2) Алгоритм RLE сжимает входные данные, заменяя каждую последовательность идентичных символов длиной последовательности и самим символом. Таким образом, aaa становится 3a, aabccc становится 2a1b3c и т. д. Использование i = j + 1 гарантирует, что алгоритм «перепрыгивает» через символы, которые уже были оценены.

rosa b. 11.05.2022 10:34

(2/2) Возьмем, к примеру, строку aabccc. Начиная с i=0 и ch=a. Внутренний цикл проверяет, есть ли более одного a. И да, действительно: есть 2 as. Итак, aa в исходной строке заменяется на 2a. Теперь, когда первые два символа исходной строки обработаны, вы переходите к 3-й букве, которой в примере является b. И так далее...

rosa b. 11.05.2022 10:34

Другие вопросы по теме