powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / генерация строки, устойчивой к ошибкам ввода
49 сообщений из 49, показаны все 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
генерация строки, устойчивой к ошибкам ввода
    #35330082
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
генерация строки, устойчивой к ошибкам ввода
    #35330086
wiks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЧего-то я не понял, а какой смысл в этой задаче?
Если все это " необходимо для того, чтобы при вводе кодов вручную и опечатке, не получалось так, что пользователь ввел другой существующий код. " То увы, вас никакая уникальность кодов не спасет - оператор всегда может ошибиться строкой и набить не тот код просто потому что забыл линейку передвинуть.

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

Одно другому не мешает, а введение гарантированного отличия в N позиций только поможет (причем алгоритм получился линейный с учетом хранения небольшой матрицы и текущего состояния алгоритма (номер текущих строк в матрице и текущее состояние "размножения").

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

По-моему алгоритм интересный, и к тому же рабочий.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330093
wiks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, тормознул :-))))
При этом ЛЮБЫЕ две строки (в том числе соседние) отличаются друг от друга в N/2 позициях !!!!
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330102
wiks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно вот так:

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

Для каждых двух соседних строк (R-1 раз):
1)находим X «позиций размножения», где X = log2( (2^K) / (R-1)) = K / log2(R-1)
2)Перебираем 2^X вариантов, генерируя последовательно (из нижней из этих двух строк) на выход алгоритма 2^X строк
3. В итоге имеем на выходе алгоритма (R-1) * ( 2 ^ X) = 2^K строк, отличающихся не менее чем в N позициях.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330105
White OwlЧего-то я не понял, а какой смысл в этой задаче?
Если все это " необходимо для того, чтобы при вводе кодов вручную и опечатке, не получалось так, что пользователь ввел другой существующий код. " То увы, вас никакая уникальность кодов не спасет - оператор всегда может ошибиться строкой и набить не тот код просто потому что забыл линейку передвинуть.


White Owl
Задача забавна, но бессмысленна.
В реальном мире это решается выпадающими списками и сканерами штрихкодов.


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

Задача: уменьшить вероятность того, что оператор нажал один или несколько раз не ту клавишу.

Опережая вопрос по поводу того, что успользуется уникальная информация о пользователе - значит нет проблемы: нет это не так.

например используется логин как часть кода
логин1: grot
логин2: grod

логин должен быть уникальным но может отличаться всего на 1 символ. Это означает, что оставшаяся часть кода должна быть устойчива к ошибкам ввода.

Вот так. Есть предложения?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330106
wiks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. исходные рассуждения были такие:
матрица 2х2 - 2 строки, 1 позиция обязательно отличается
матрица 4х4 - 4 строки, 2 позиции обязательно отличаются
матрица 8х8 - 8 строки, 4 позиции обязательно отличаются
...
и т.д.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330109
wiksПравильно вот так:

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

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

Спасибо за алгоритм! Постараюсь написать програмку и выложу ее здесь для обсуждения!
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330111
wiks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, не пойдет алгоритм :-(((

вот это не пойдет:
Перебираем 2^X вариантов, генерируя последовательно (из нижней из этих двух строк) на выход алгоритма 2^X строк

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

Бывает, ступил, плохой вариант....
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330114
wiksне, не пойдет алгоритм :-(((

вот это не пойдет:
Перебираем 2^X вариантов, генерируя последовательно (из нижней из этих двух строк) на выход алгоритма 2^X строк

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

Бывает, ступил, плохой вариант....

Ничего! Добьемся решения!

У кого какое мнения?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330280
Damien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы просто сгенерил огромную таблицу (32^5), перебирающую все возможные значения т.е. от ААААА до ЯЯЯЯЯ и перемещался по ней с определенным шагом (32^3), выбирая заведомо отличающиеся друг от друга значения. Либо сразу создавать таблицу так, чтобы генератор выдавал очередную строку с тем же шагом.
Процедуры перебора значений, при заданном наборе символов, уже написаны для практически всех языков.
Уникальность кодов будет гарантироваться занесением в таблицу значения False напротив вбитого ранее кода.
В этом решении, конечно, выгоднее использовать БД, хотя она уже наверняка предусмотрена в такой программе?

P.S.
выше заданные значения нуждаются в проверке. За длину алфавита взято 32, хотя лучше выкинуть всякие там Ъ Ь Й...
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330486
RMih
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. Пользователь указывает свой персональный код в бумажной анкете (это исключает использование штрих кода). После этого оператор должен вручную ввести пользовательский код в систему (нет ни каких выпадающих списков). Таковы условия ТЗ.
1. Да, оператор может ошибиться и ввести код, который принадлежит другому пользователю. Этот тип ошибок ввода отслеживается другими методами и в данном вопросе не имеет значения. (решается путем добавления в код уникальной информации, относящейся только к пользователю)

Задача: уменьшить вероятность того, что оператор нажал один или несколько раз не ту клавишу.

Опережая вопрос по поводу того, что успользуется уникальная информация о пользователе - значит нет проблемы: нет это не так.

например используется логин как часть кода
логин1: grot
логин2: grod

логин должен быть уникальным но может отличаться всего на 1 символ. Это означает, что оставшаяся часть кода должна быть устойчива к ошибкам ввода.

Вот так. Есть предложения?[/quot]
Что же все-таки мешает хранить в персональном коде пользователя контрольные цифры/буквы?
По-моему, это существенно уменьшит вероятность ошибок ввода. Такой подход, например, используется в номерах банковских счетов и в штрих-кодах.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330634
Damienя бы просто сгенерил огромную таблицу (32^5), перебирающую все возможные значения т.е. от ААААА до ЯЯЯЯЯ и перемещался по ней с определенным шагом (32^3), выбирая заведомо отличающиеся друг от друга значения. Либо сразу создавать таблицу так, чтобы генератор выдавал очередную строку с тем же шагом.
Процедуры перебора значений, при заданном наборе символов, уже написаны для практически всех языков.
Уникальность кодов будет гарантироваться занесением в таблицу значения False напротив вбитого ранее кода.
В этом решении, конечно, выгоднее использовать БД, хотя она уже наверняка предусмотрена в такой программе?

P.S.
выше заданные значения нуждаются в проверке. За длину алфавита взято 32, хотя лучше выкинуть всякие там Ъ Ь Й...

Вариент не подходит, т.к. необходимо сгенерировать все коды сразу и хранить их в БД (даже те, которые еще не используются).
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330638
RMih2. Пользователь указывает свой персональный код в бумажной анкете (это исключает использование штрих кода). После этого оператор должен вручную ввести пользовательский код в систему (нет ни каких выпадающих списков). Таковы условия ТЗ.
1. Да, оператор может ошибиться и ввести код, который принадлежит другому пользователю. Этот тип ошибок ввода отслеживается другими методами и в данном вопросе не имеет значения. (решается путем добавления в код уникальной информации, относящейся только к пользователю)

Задача: уменьшить вероятность того, что оператор нажал один или несколько раз не ту клавишу.

Опережая вопрос по поводу того, что успользуется уникальная информация о пользователе - значит нет проблемы: нет это не так.

например используется логин как часть кода
логин1: grot
логин2: grod

логин должен быть уникальным но может отличаться всего на 1 символ. Это означает, что оставшаяся часть кода должна быть устойчива к ошибкам ввода.

Вот так. Есть предложения?
Что же все-таки мешает хранить в персональном коде пользователя контрольные цифры/буквы?
По-моему, это существенно уменьшит вероятность ошибок ввода. Такой подход, например, используется в номерах банковских счетов и в штрих-кодах.[/quot]

Допустимый вариант. Буду изучать как это сделать (добавить и передать контрольную сумму). Спасибо.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35330704
Николай1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор Алексей miksoft Автор Алексей
Ошибочка ввода :)

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

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

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

И как? :) Можете привести алгоритм? и его вычислительную сложность? Если этот алгоритм предусматривае предварительную выборку всех строк, сгенерированных до этого ид БД (например), то не подходит... таких строк будут миллионы.

Операторы вобьют миллионы записей за короткое время?
Да и, вообще, какая-то странная задача.
Сначала в одной системе надо сгенерировать коды, потом перенести их на бумагу, с которой оператор снова их введет.
Как-то странно это выглядит, не находите?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35331308
Николай1 Автор Алексей miksoft Автор Алексей
Ошибочка ввода :)

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

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

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

И как? :) Можете привести алгоритм? и его вычислительную сложность? Если этот алгоритм предусматривае предварительную выборку всех строк, сгенерированных до этого ид БД (например), то не подходит... таких строк будут миллионы.

Операторы вобьют миллионы записей за короткое время?
Да и, вообще, какая-то странная задача.
Сначала в одной системе надо сгенерировать коды, потом перенести их на бумагу, с которой оператор снова их введет.
Как-то странно это выглядит, не находите?

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

Задача решена использованием контрольной суммы CRC32. Всем большое спасибо!!!!!!!!!!!
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35331321
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор АлексейЗадача решена использованием контрольной суммы CRC32.Если не секрет - как вы ее прикрутили к русским буквам?
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35331494
miksoft Автор АлексейЗадача решена использованием контрольной суммы CRC32.Если не секрет - как вы ее прикрутили к русским буквам?

Мне нужно было использовать символы английского алфавита. А почему должна быть проблема использования русских символов? Можно для каждого символа есть всей бинарный код. достаточно договориться о кодировке.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35331509
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор Алексей miksoft Автор АлексейЗадача решена использованием контрольной суммы CRC32.Если не секрет - как вы ее прикрутили к русским буквам?Мне нужно было использовать символы английского алфавита. А почему должна быть проблема использования русских символов? Можно для каждого символа есть всей бинарный код. достаточно договориться о кодировке.Еще недавно вам не нравилось, что "код Хемминга предусматривает работу с двоичными кодами".
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35331665
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я реализовывал коды Рида-Маллера для произвольных параметров:)
Программа правда не шибко оптимизированная по скорости, зато работает и по ней можно разобрать алгоритм(я не нешел в свободном доступе алгоритма декодированя произвольных кодов, и поэтому придумал сам)
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35331788
miksoft Автор Алексей miksoft Автор АлексейЗадача решена использованием контрольной суммы CRC32.Если не секрет - как вы ее прикрутили к русским буквам?Мне нужно было использовать символы английского алфавита. А почему должна быть проблема использования русских символов? Можно для каждого символа есть всей бинарный код. достаточно договориться о кодировке.Еще недавно вам не нравилось, что "код Хемминга предусматривает работу с двоичными кодами".

Присто не понимал коды Хеменга.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35332491
Хемминга
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Автор АлексейНеобходимо реализовать такой алгоритм, который на основании AAA сгенерирует ABB, BAB, BBA, ACC, CAC, CCA (это в случае с учтойчивостью для одной ошибки ввода).
ндя, а если вводя ААА юзер ошибется в первом символе и наберет "ВАА", то Вы это отнесете к "ААА", "ВАВ" или "ВВА"?

коды Хемминга немного не то что нужно имхо.
если две строки, развернутые в двоичную цепочку, отличаются в 8 битах, то они отличаются в 1ом символе или в 8и символах?
но идею у дяди Х. позаимствовать стоит.
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35333529
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хемминга Автор АлексейНеобходимо реализовать такой алгоритм, который на основании AAA сгенерирует ABB, BAB, BBA, ACC, CAC, CCA (это в случае с учтойчивостью для одной ошибки ввода). ндя, а если вводя ААА юзер ошибется в первом символе и наберет "ВАА", то Вы это отнесете к "ААА", "ВАВ" или "ВВА"?В той статье, накоторую я уже давал ссылку, различаются ситуации, когда можно определить ошибку и можно исправить ошибку. Автору нужно лишь определить ошибку, так что он вполне сможет отфильтровать строку "ВАА".
...
Рейтинг: 0 / 0
генерация строки, устойчивой к ошибкам ввода
    #35334187
Vasssoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавлю: можно применить теорию кодов обнаруживающих/исправляющих ошибки. В данном случае лучше всего имхо подходит линейное блочное кодирование. Кодовая комбинация состоит в этом случае из n информационных и m проверочных бит.
Определяемся с требованиями к корректирующиму коду: 1) сколько ошибок он должен обнаруживать 2) сколько ошибок он должен исправлять 3) сколько уникальных кодовых комбинаций должно быть
по формулам (см. google) определяем m и пишем алгоритм. Дело это хорошо отработанное и широко используемое в телекоме.
...
Рейтинг: 0 / 0
49 сообщений из 49, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / генерация строки, устойчивой к ошибкам ввода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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