powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / генерация строки, устойчивой к ошибкам ввода
25 сообщений из 49, страница 1 из 2
генерация строки, устойчивой к ошибкам ввода
    #35327020
Aлеkcеi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо сгенерировать строку, которая гарантированно отличается от всех других сгенерированных до этого строк на n символов. При этом алгоритм генерации должнен создавать строки "последовательно" в соответствии с указаным множеством сомволов, которые можно использовать для генерации, используя значение, сгенерированное до этого. Например:

Нужно сгенерировать строку из 5 символов.
Можно использовать символы русского алфавита
Должны отличаться 3 символа.

Результат:
АБВГД
АБЗЖЕ
АБИКЛ
АБМНО
АБПРС

и т.д

Есть ли у кого мнения по этому?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35327131
Алексеi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточнение: это необходимо для того, чтобы при вводе кодов вручную и опечатке, не получалось так, что пользователь ввел другой существующий код.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35327234
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, в поисках вам поможет то, что "отличается от всех других сгенерированных до этого строк на n символов" - это называется "расстояние".
Подробнее - см. статью Анализ строк , параграф 3.2
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35327238
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А стоит ли задача найти множество максимально возможного размера? Или пойдет любое?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35327257
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, может, вам не стоит заморачитваться на это "расстояние" и просто часть (в приведенном примере 3-1=2) символов выделять под контрольную сумму?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35327754
miksoftА стоит ли задача найти множество максимально возможного размера? Или пойдет любое?

Нет, задача найти такое множество не стоит. Необходимо иметь возможность генерировать эти строки на основании предыдущего результата.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35327767
miksoftХотя, может, вам не стоит заморачитваться на это "расстояние" и просто часть (в приведенном примере 3-1=2) символов выделять под контрольную сумму?

Объясните подробнее что имеете в виду. Не важно каим способом решается задача. злавное результат. - устойчивость строки к ошибкам ввода (оператор должен вручную вводить коды при этом необходимо гарантировать, что если он ошибется n раз, то не введет случайно другой существующий код)
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35327774
miksoftВозможно, в поисках вам поможет то, что "отличается от всех других сгенерированных до этого строк на n символов" - это называется "расстояние".
Подробнее - см. статью Анализ строк , параграф 3.2 Спасибо за ссылку. Посмотрю.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35327810
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор Алексей miksoftА стоит ли задача найти множество максимально возможного размера? Или пойдет любое?

Нет, задача найти такое множество не стоит.Ну тогда можно воспользоваться алгоритмом, аналогичным алгоритму для поиска простых чисел "решето Эратосфена". Т.е. берете множество всех возможных комбинаций символов. Помечаете минимальную строку как подходящую. Затем вычеркиваете все остальные строки, которые слишком "близки" к этой помеченной строке. Затем из оставшихся строк опять выбираете минимальную. И так в цикле, пока все строки не будут либо исключены, либо помечены как подходящие.
Автор Алексей
Необходимо иметь возможность генерировать эти строки на основании предыдущего результата.а вот это не понял, это как?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35327893
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор Алексей miksoftХотя, может, вам не стоит заморачитваться на это "расстояние" и просто часть (в приведенном примере 3-1=2) символов выделять под контрольную сумму?
Объясните подробнее что имеете в виду. Не важно каим способом решается задача. злавное результат. - устойчивость строки к ошибкам ввода (оператор должен вручную вводить коды при этом необходимо гарантировать, что если он ошибется n раз, то не введет случайно другой существующий код) Код Хемминга
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35328940
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексеiУточнение: это необходимо для того, чтобы при вводе кодов вручную и опечатке, не получалось так, что пользователь ввел другой существующий код.

Коды и идентификаторы нельзя вводить с опечатками.

В случае с ФИО, если оператор набирает:

Код: plaintext
Инваов Пхорор Сееревич

можно, задавшись критерием близости (расстояние Хэмминга, созвучие слогов или букв, определить что нужно было ввести:

Код: plaintext
Иванов Прохор Сервеевич

В случае с кодами, промах в одну цифру может дать парадоксальный результат. Скорее всего будет выбран не тот ID, хотя алгоритм отработает верно. А вводить эвристические коэффициенты в промышленную систему это значит поставить её в состояние "вечной отладки".

Может быть вам стоит подумать над тем, чтобы оператор не вводил код вручную а выбирал его из умного ComboBox c дополнительным полем типа Комментарий ?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329037
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКоды и идентификаторы нельзя вводить с опечатками.Почему нельзя? Вполне можно с учетом кодов обнаружения и коррекции ошибок.
Да и не всегда опечатка происходит на последней стадии, при вводе в компьютер.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329070
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также было бы неплохо почитать книху Блэйхута "теория и практика кодов, контроллирующих ошибки". но это если времени много
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329829
miksoft Автор Алексей miksoftА стоит ли задача найти множество максимально возможного размера? Или пойдет любое?

Нет, задача найти такое множество не стоит.Ну тогда можно воспользоваться алгоритмом, аналогичным алгоритму для поиска простых чисел "решето Эратосфена". Т.е. берете множество всех возможных комбинаций символов. Помечаете минимальную строку как подходящую. Затем вычеркиваете все остальные строки, которые слишком "близки" к этой помеченной строке. Затем из оставшихся строк опять выбираете минимальную. И так в цикле, пока все строки не будут либо исключены, либо помечены как подходящие.

Данный алгоритм не подходит, т.к. предусматривает предварительный отбор всех строк и дальнейшее их использование.

Автор Алексей
Необходимо иметь возможность генерировать эти строки на основании предыдущего результата.а вот это не понял, это как?

Это как раз связано с 1. Генерация должна выполняться на основании предыдущей строки. Например: для чисел на основании 1 генерируется 2 - 3 - 4 - 5 и т.д. но здесь не предусмотрена "устойчивость" к ошибкам ввода. Необходимо реализовать такой алгоритм, который на основании AAA сгенерирует ABB, BAB, BBA, ACC, CAC, CCA (это в случае с учтойчивостью для одной ошибки ввода). Т.е. если пользователь введет ABC - то будет известно, что эта строка ошибочная (как это не сейчас не важно - все сгенерированные строки, отвечающие критериям устойчивости будут храниться в БД)

Есть идеи?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329832
miksoft Автор Алексей miksoftА стоит ли задача найти множество максимально возможного размера? Или пойдет любое?

Нет, задача найти такое множество не стоит.Ну тогда можно воспользоваться алгоритмом, аналогичным алгоритму для поиска простых чисел "решето Эратосфена". Т.е. берете множество всех возможных комбинаций символов. Помечаете минимальную строку как подходящую. Затем вычеркиваете все остальные строки, которые слишком "близки" к этой помеченной строке. Затем из оставшихся строк опять выбираете минимальную. И так в цикле, пока все строки не будут либо исключены, либо помечены как подходящие.

Автор Алексей
Необходимо иметь возможность генерировать эти строки на основании предыдущего результата.а вот это не понял, это как?

Ошибочка ввода :)

1. Данный алгоритм не подходит, т.к. предусматривает предварительный отбор всех строк и дальнейшее их использование.

2. Это как раз связано с 1. Генерация должна выполняться на основании предыдущей строки. Например: для чисел на основании 1 генерируется 2 - 3 - 4 - 5 и т.д. но здесь не предусмотрена "устойчивость" к ошибкам ввода. Необходимо реализовать такой алгоритм, который на основании AAA сгенерирует ABB, BAB, BBA, ACC, CAC, CCA (это в случае с учтойчивостью для одной ошибки ввода). Т.е. если пользователь введет ABC - то будет известно, что эта строка ошибочная (как это не сейчас не важно - все сгенерированные строки, отвечающие критериям устойчивости будут храниться в БД)

Есть идеи?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329842
miksoft Автор Алексей miksoftХотя, может, вам не стоит заморачитваться на это "расстояние" и просто часть (в приведенном примере 3-1=2) символов выделять под контрольную сумму?
Объясните подробнее что имеете в виду. Не важно каим способом решается задача. злавное результат. - устойчивость строки к ошибкам ввода (оператор должен вручную вводить коды при этом необходимо гарантировать, что если он ошибется n раз, то не введет случайно другой существующий код) Код Хемминга

На сколько я понял, код Хемминга предусматривает работу с двоичными кодами и необходим для контроля передачи информации по контрольной сумме. Но не может застраховать от ошибок ввода.

Пример 1. Пусть имеем основной код 100110, то есть К = 6. Следовательно, L = 3 и дополнительный код равен

010 # 011 # 110 = 111,

где # — символ операции поразрядного сложения, и после инвертирования имеем 000. Теперь вместе с основным кодом будет передан и дополнительный. На приемном конце вновь рассчитывается дополнительный код и сравнивается с переданным. Фиксируется код сравнения (поразрядная операция отрицания равнозначности), и если он отличен от нуля, то его значение есть номер ошибочно принятого разряда основного кода. Так, если принят код 100010, то рассчитанный в приемнике дополнительный код равен инверсии от 010 # 110 = 100, то есть 011, что означает ошибку в 3-м разряде.

Но насколько я понял этот метод не подходит для этой задачи. Это так (читайте предыдущее сообщение)
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329845
mayton АлексеiУточнение: это необходимо для того, чтобы при вводе кодов вручную и опечатке, не получалось так, что пользователь ввел другой существующий код.

Коды и идентификаторы нельзя вводить с опечатками.

В случае с ФИО, если оператор набирает:

Код: plaintext
Инваов Пхорор Сееревич

можно, задавшись критерием близости (расстояние Хэмминга, созвучие слогов или букв, определить что нужно было ввести:

Код: plaintext
Иванов Прохор Сервеевич

В случае с кодами, промах в одну цифру может дать парадоксальный результат. Скорее всего будет выбран не тот ID, хотя алгоритм отработает верно. А вводить эвристические коэффициенты в промышленную систему это значит поставить её в состояние "вечной отладки".

Может быть вам стоит подумать над тем, чтобы оператор не вводил код вручную а выбирал его из умного ComboBox c дополнительным полем типа Комментарий ?

1. Код может быть введен с опечатками
2. Система не ставит перед собой целью исправления кода
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329848
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор Алексей
Ошибочка ввода :)

1. Данный алгоритм не подходит, т.к. предусматривает предварительный отбор всех строк и дальнейшее их использование.

2. Это как раз связано с 1. Генерация должна выполняться на основании предыдущей строки. Например: для чисел на основании 1 генерируется 2 - 3 - 4 - 5 и т.д. но здесь не предусмотрена "устойчивость" к ошибкам ввода. Необходимо реализовать такой алгоритм, который на основании AAA сгенерирует ABB, BAB, BBA, ACC, CAC, CCA (это в случае с учтойчивостью для одной ошибки ввода). Т.е. если пользователь введет ABC - то будет известно, что эта строка ошибочная (как это не сейчас не важно - все сгенерированные строки, отвечающие критериям устойчивости будут храниться в БД)

Есть идеи?Не обязательно все результирующее множество генерить сразу, можно генерить новые строки по мере необходимости.
Правда, для этого придется хранить все ранее выданные. И с каждой новой строкой будет медленнее...
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329851
zloy denТакже было бы неплохо почитать книху Блэйхута "теория и практика кодов, контроллирующих ошибки". но это если времени много

Можно... но так описано как генерировать строки, которые гарантированно отличаются на N символов до предыдуще сгенерированных строк?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329856
miksoft Автор Алексей
Ошибочка ввода :)

1. Данный алгоритм не подходит, т.к. предусматривает предварительный отбор всех строк и дальнейшее их использование.

2. Это как раз связано с 1. Генерация должна выполняться на основании предыдущей строки. Например: для чисел на основании 1 генерируется 2 - 3 - 4 - 5 и т.д. но здесь не предусмотрена "устойчивость" к ошибкам ввода. Необходимо реализовать такой алгоритм, который на основании AAA сгенерирует ABB, BAB, BBA, ACC, CAC, CCA (это в случае с учтойчивостью для одной ошибки ввода). Т.е. если пользователь введет ABC - то будет известно, что эта строка ошибочная (как это не сейчас не важно - все сгенерированные строки, отвечающие критериям устойчивости будут храниться в БД)

Есть идеи?Не обязательно все результирующее множество генерить сразу, можно генерить новые строки по мере необходимости.
Правда, для этого придется хранить все ранее выданные. И с каждой новой строкой будет медленнее...

И как? :) Можете привести алгоритм? и его вычислительную сложность? Если этот алгоритм предусматривае предварительную выборку всех строк, сгенерированных до этого ид БД (например), то не подходит... таких строк будут миллионы.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329865
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор АлексейНа сколько я понял, код Хемминга предусматривает работу с двоичными кодами и необходим для контроля передачи информации по контрольной сумме. Но не может застраховать от ошибок ввода.Вывод в одной точке и ввод в другой - это та же передача информации.
Автор АлексейНо насколько я понял этот метод не подходит для этой задачи.Символы в строке у вас же все равно имеют двоичное представление. Вот для него и считайте контрольную сумму. Если вас смущает возможная нечитабельность полученных символов, то base64 (или аналогичный с другим выходным алфавитом) поможет.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35329868
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор АлексейИ как? :) Можете привести алгоритм? и его вычислительную сложность? Если этот алгоритм предусматривае предварительную выборку всех строк, сгенерированных до этого ид БД (например), то не подходит... таких строк будут миллионы.Сложность, увы, квадратичная. Т.е. при миллионах записей явно не пойдет...
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330059
wiks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, интересная задачка, стало интересно, начал искать в инете, случайно наткнулся на преобразование адамаpа-уолша. нашел пример, окзывается, там строится очень интересная матрица http://www.enlight.ru/demo/faq/smth.phtml?query=alg_comp_aw , вот цитата:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
...а вот пpо пpеобpазование адамаpа-уолша я pасскажу с удовольствием (хотя
 и очень кpатко), ибо то, что ты найдешь в общедоступных учебниках, чаще
 всего излишне нагpужено сопутствующим матеpиалом.

 итак:

 матpица пpеобpазования для  2 -х отсчетов выглядит так

  1    1 
  1  - 1 

 для получения матpицы следующего поpядка надо спpава и снизу pаскопиpовать
 матpицу пpедыдущего поpядка, а по диагонали добавить ту же матpицу
 пpедыдущего поpядка, только инвеpтиpованную. для пpимеpа, матpица
 пpеобpазования  2 -го поpядка с pазделительными линиями, для наглядности

    1     1   |   1     1 
    1   - 1   |   1   - 1 
   -------+--------
    1     1   | - 1   - 1 
    1   - 1   | - 1     1 
...

Расширил в экселе еще на один порядок, получилось:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 1 	  1 	  1 	  1 	  1 	  1 	  1 	  1 
 1 	- 1 	  1 	- 1 	  1 	- 1 	  1 	- 1 
 1 	  1 	- 1 	- 1 	  1 	  1 	- 1 	- 1 
 1 	- 1 	- 1 	  1 	  1 	- 1 	- 1 	  1 
 1 	  1 	  1 	  1 	- 1 	- 1 	- 1 	- 1 
 1 	- 1 	  1 	- 1 	- 1 	  1 	- 1 	  1 
 1 	  1 	- 1 	- 1 	- 1 	- 1 	  1 	  1 
 1 	- 1 	- 1 	  1 	- 1 	  1 	  1 	- 1 

Можно заметить закономерность: для матрицы N x N мы имеем N строк из N двоичных чисел (если заменить "-1" на ноль).
При этом ЛЮБЫЕ две строки (в том числе соседние) отличаются друг от друга в (N-1) позициях.

Если бы у меня была подобная исходной задача, примерно такая:
создать алгоритм генерации 2^K двоичных чисел, отличающихся не менее чем в N позициях

то решить ее можно например так:
1. создать вот такую матрицу (с нулем вместо "-1") размерности R x R, где R = N + K + 1
2. я имею R строк, отличающихся в N + K позициях, а мне нужно 2^K строк в N позициях. Что делать?

Допустим
Для каждых двух соседних строк (то есть R-1 раз):
1)находим К «позиций размножения» - это К позиций, отличающихся в этих строках
2)Перебираем 2^К вариантов, генерируя из нижней соседней строки 2^K строк
3. В итоге имеем (R-1) * (2^K) +1 строк (+1 это самая первая строка, она не «размножается»)

хм, ну ладно, тогда так:
Для каждых двух соседних строк:
1)находим X «позиций размножения», где X = log2( (2^K) / (R-1)) = K / log2(R-1)
2)Перебираем 2^X вариантов
3. В итоге имеем (R-1) * ( 2 ^ X) +1 = 2^K+1 строк, отличающихся не менее чем в N позициях.

Остался вопрос, как выбирать эти Х позиций, чтобы уменьшить кол-во одинаковых «последовательностей» между смежными строками? Можно выбирать отличающиеся позиции «через одну»?

И еще, если к матрице подставить снизу инвертированную, то можно пользоваться и такой «удвоенной».

Пойдет?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330071
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего-то я не понял, а какой смысл в этой задаче?
Если все это " необходимо для того, чтобы при вводе кодов вручную и опечатке, не получалось так, что пользователь ввел другой существующий код. " То увы, вас никакая уникальность кодов не спасет - оператор всегда может ошибиться строкой и набить не тот код просто потому что забыл линейку передвинуть.

Задача забавна, но бессмысленна.
В реальном мире это решается выпадающими списками и сканерами штрихкодов.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330079
wiks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, да заметил только что: R это не N + K + 1

Из-за ограниченности построения матрицы, R - это минимальная степень двойки, больше либо равная N + K + 1
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / генерация строки, устойчивой к ошибкам ввода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]