|
|
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Необходимо сгенерировать строку, которая гарантированно отличается от всех других сгенерированных до этого строк на n символов. При этом алгоритм генерации должнен создавать строки "последовательно" в соответствии с указаным множеством сомволов, которые можно использовать для генерации, используя значение, сгенерированное до этого. Например: Нужно сгенерировать строку из 5 символов. Можно использовать символы русского алфавита Должны отличаться 3 символа. Результат: АБВГД АБЗЖЕ АБИКЛ АБМНО АБПРС и т.д Есть ли у кого мнения по этому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2008, 18:02 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Уточнение: это необходимо для того, чтобы при вводе кодов вручную и опечатке, не получалось так, что пользователь ввел другой существующий код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2008, 18:40 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Возможно, в поисках вам поможет то, что "отличается от всех других сгенерированных до этого строк на n символов" - это называется "расстояние". Подробнее - см. статью Анализ строк , параграф 3.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2008, 19:23 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
А стоит ли задача найти множество максимально возможного размера? Или пойдет любое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2008, 19:27 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Хотя, может, вам не стоит заморачитваться на это "расстояние" и просто часть (в приведенном примере 3-1=2) символов выделять под контрольную сумму? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2008, 19:41 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
miksoftА стоит ли задача найти множество максимально возможного размера? Или пойдет любое? Нет, задача найти такое множество не стоит. Необходимо иметь возможность генерировать эти строки на основании предыдущего результата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 11:12 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
miksoftХотя, может, вам не стоит заморачитваться на это "расстояние" и просто часть (в приведенном примере 3-1=2) символов выделять под контрольную сумму? Объясните подробнее что имеете в виду. Не важно каим способом решается задача. злавное результат. - устойчивость строки к ошибкам ввода (оператор должен вручную вводить коды при этом необходимо гарантировать, что если он ошибется n раз, то не введет случайно другой существующий код) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 11:15 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
miksoftВозможно, в поисках вам поможет то, что "отличается от всех других сгенерированных до этого строк на n символов" - это называется "расстояние". Подробнее - см. статью Анализ строк , параграф 3.2 Спасибо за ссылку. Посмотрю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 11:16 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Автор Алексей miksoftА стоит ли задача найти множество максимально возможного размера? Или пойдет любое? Нет, задача найти такое множество не стоит.Ну тогда можно воспользоваться алгоритмом, аналогичным алгоритму для поиска простых чисел "решето Эратосфена". Т.е. берете множество всех возможных комбинаций символов. Помечаете минимальную строку как подходящую. Затем вычеркиваете все остальные строки, которые слишком "близки" к этой помеченной строке. Затем из оставшихся строк опять выбираете минимальную. И так в цикле, пока все строки не будут либо исключены, либо помечены как подходящие. Автор Алексей Необходимо иметь возможность генерировать эти строки на основании предыдущего результата.а вот это не понял, это как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 11:22 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Автор Алексей miksoftХотя, может, вам не стоит заморачитваться на это "расстояние" и просто часть (в приведенном примере 3-1=2) символов выделять под контрольную сумму? Объясните подробнее что имеете в виду. Не важно каим способом решается задача. злавное результат. - устойчивость строки к ошибкам ввода (оператор должен вручную вводить коды при этом необходимо гарантировать, что если он ошибется n раз, то не введет случайно другой существующий код) Код Хемминга ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 11:36 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
АлексеiУточнение: это необходимо для того, чтобы при вводе кодов вручную и опечатке, не получалось так, что пользователь ввел другой существующий код. Коды и идентификаторы нельзя вводить с опечатками. В случае с ФИО, если оператор набирает: Код: plaintext можно, задавшись критерием близости (расстояние Хэмминга, созвучие слогов или букв, определить что нужно было ввести: Код: plaintext В случае с кодами, промах в одну цифру может дать парадоксальный результат. Скорее всего будет выбран не тот ID, хотя алгоритм отработает верно. А вводить эвристические коэффициенты в промышленную систему это значит поставить её в состояние "вечной отладки". Может быть вам стоит подумать над тем, чтобы оператор не вводил код вручную а выбирал его из умного ComboBox c дополнительным полем типа Комментарий ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 15:36 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
maytonКоды и идентификаторы нельзя вводить с опечатками.Почему нельзя? Вполне можно с учетом кодов обнаружения и коррекции ошибок. Да и не всегда опечатка происходит на последней стадии, при вводе в компьютер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 15:58 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Также было бы неплохо почитать книху Блэйхута "теория и практика кодов, контроллирующих ошибки". но это если времени много ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 16:06 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
miksoft Автор Алексей miksoftА стоит ли задача найти множество максимально возможного размера? Или пойдет любое? Нет, задача найти такое множество не стоит.Ну тогда можно воспользоваться алгоритмом, аналогичным алгоритму для поиска простых чисел "решето Эратосфена". Т.е. берете множество всех возможных комбинаций символов. Помечаете минимальную строку как подходящую. Затем вычеркиваете все остальные строки, которые слишком "близки" к этой помеченной строке. Затем из оставшихся строк опять выбираете минимальную. И так в цикле, пока все строки не будут либо исключены, либо помечены как подходящие. Данный алгоритм не подходит, т.к. предусматривает предварительный отбор всех строк и дальнейшее их использование. Автор Алексей Необходимо иметь возможность генерировать эти строки на основании предыдущего результата.а вот это не понял, это как? Это как раз связано с 1. Генерация должна выполняться на основании предыдущей строки. Например: для чисел на основании 1 генерируется 2 - 3 - 4 - 5 и т.д. но здесь не предусмотрена "устойчивость" к ошибкам ввода. Необходимо реализовать такой алгоритм, который на основании AAA сгенерирует ABB, BAB, BBA, ACC, CAC, CCA (это в случае с учтойчивостью для одной ошибки ввода). Т.е. если пользователь введет ABC - то будет известно, что эта строка ошибочная (как это не сейчас не важно - все сгенерированные строки, отвечающие критериям устойчивости будут храниться в БД) Есть идеи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 20:05 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
miksoft Автор Алексей miksoftА стоит ли задача найти множество максимально возможного размера? Или пойдет любое? Нет, задача найти такое множество не стоит.Ну тогда можно воспользоваться алгоритмом, аналогичным алгоритму для поиска простых чисел "решето Эратосфена". Т.е. берете множество всех возможных комбинаций символов. Помечаете минимальную строку как подходящую. Затем вычеркиваете все остальные строки, которые слишком "близки" к этой помеченной строке. Затем из оставшихся строк опять выбираете минимальную. И так в цикле, пока все строки не будут либо исключены, либо помечены как подходящие. Автор Алексей Необходимо иметь возможность генерировать эти строки на основании предыдущего результата.а вот это не понял, это как? Ошибочка ввода :) 1. Данный алгоритм не подходит, т.к. предусматривает предварительный отбор всех строк и дальнейшее их использование. 2. Это как раз связано с 1. Генерация должна выполняться на основании предыдущей строки. Например: для чисел на основании 1 генерируется 2 - 3 - 4 - 5 и т.д. но здесь не предусмотрена "устойчивость" к ошибкам ввода. Необходимо реализовать такой алгоритм, который на основании AAA сгенерирует ABB, BAB, BBA, ACC, CAC, CCA (это в случае с учтойчивостью для одной ошибки ввода). Т.е. если пользователь введет ABC - то будет известно, что эта строка ошибочная (как это не сейчас не важно - все сгенерированные строки, отвечающие критериям устойчивости будут храниться в БД) Есть идеи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 20:07 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
miksoft Автор Алексей miksoftХотя, может, вам не стоит заморачитваться на это "расстояние" и просто часть (в приведенном примере 3-1=2) символов выделять под контрольную сумму? Объясните подробнее что имеете в виду. Не важно каим способом решается задача. злавное результат. - устойчивость строки к ошибкам ввода (оператор должен вручную вводить коды при этом необходимо гарантировать, что если он ошибется n раз, то не введет случайно другой существующий код) Код Хемминга На сколько я понял, код Хемминга предусматривает работу с двоичными кодами и необходим для контроля передачи информации по контрольной сумме. Но не может застраховать от ошибок ввода. Пример 1. Пусть имеем основной код 100110, то есть К = 6. Следовательно, L = 3 и дополнительный код равен 010 # 011 # 110 = 111, где # — символ операции поразрядного сложения, и после инвертирования имеем 000. Теперь вместе с основным кодом будет передан и дополнительный. На приемном конце вновь рассчитывается дополнительный код и сравнивается с переданным. Фиксируется код сравнения (поразрядная операция отрицания равнозначности), и если он отличен от нуля, то его значение есть номер ошибочно принятого разряда основного кода. Так, если принят код 100010, то рассчитанный в приемнике дополнительный код равен инверсии от 010 # 110 = 100, то есть 011, что означает ошибку в 3-м разряде. Но насколько я понял этот метод не подходит для этой задачи. Это так (читайте предыдущее сообщение) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 20:16 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
mayton АлексеiУточнение: это необходимо для того, чтобы при вводе кодов вручную и опечатке, не получалось так, что пользователь ввел другой существующий код. Коды и идентификаторы нельзя вводить с опечатками. В случае с ФИО, если оператор набирает: Код: plaintext можно, задавшись критерием близости (расстояние Хэмминга, созвучие слогов или букв, определить что нужно было ввести: Код: plaintext В случае с кодами, промах в одну цифру может дать парадоксальный результат. Скорее всего будет выбран не тот ID, хотя алгоритм отработает верно. А вводить эвристические коэффициенты в промышленную систему это значит поставить её в состояние "вечной отладки". Может быть вам стоит подумать над тем, чтобы оператор не вводил код вручную а выбирал его из умного ComboBox c дополнительным полем типа Комментарий ? 1. Код может быть введен с опечатками 2. Система не ставит перед собой целью исправления кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 20:17 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Автор Алексей Ошибочка ввода :) 1. Данный алгоритм не подходит, т.к. предусматривает предварительный отбор всех строк и дальнейшее их использование. 2. Это как раз связано с 1. Генерация должна выполняться на основании предыдущей строки. Например: для чисел на основании 1 генерируется 2 - 3 - 4 - 5 и т.д. но здесь не предусмотрена "устойчивость" к ошибкам ввода. Необходимо реализовать такой алгоритм, который на основании AAA сгенерирует ABB, BAB, BBA, ACC, CAC, CCA (это в случае с учтойчивостью для одной ошибки ввода). Т.е. если пользователь введет ABC - то будет известно, что эта строка ошибочная (как это не сейчас не важно - все сгенерированные строки, отвечающие критериям устойчивости будут храниться в БД) Есть идеи?Не обязательно все результирующее множество генерить сразу, можно генерить новые строки по мере необходимости. Правда, для этого придется хранить все ранее выданные. И с каждой новой строкой будет медленнее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 20:21 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
zloy denТакже было бы неплохо почитать книху Блэйхута "теория и практика кодов, контроллирующих ошибки". но это если времени много Можно... но так описано как генерировать строки, которые гарантированно отличаются на N символов до предыдуще сгенерированных строк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 20:23 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
miksoft Автор Алексей Ошибочка ввода :) 1. Данный алгоритм не подходит, т.к. предусматривает предварительный отбор всех строк и дальнейшее их использование. 2. Это как раз связано с 1. Генерация должна выполняться на основании предыдущей строки. Например: для чисел на основании 1 генерируется 2 - 3 - 4 - 5 и т.д. но здесь не предусмотрена "устойчивость" к ошибкам ввода. Необходимо реализовать такой алгоритм, который на основании AAA сгенерирует ABB, BAB, BBA, ACC, CAC, CCA (это в случае с учтойчивостью для одной ошибки ввода). Т.е. если пользователь введет ABC - то будет известно, что эта строка ошибочная (как это не сейчас не важно - все сгенерированные строки, отвечающие критериям устойчивости будут храниться в БД) Есть идеи?Не обязательно все результирующее множество генерить сразу, можно генерить новые строки по мере необходимости. Правда, для этого придется хранить все ранее выданные. И с каждой новой строкой будет медленнее... И как? :) Можете привести алгоритм? и его вычислительную сложность? Если этот алгоритм предусматривае предварительную выборку всех строк, сгенерированных до этого ид БД (например), то не подходит... таких строк будут миллионы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 20:27 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Автор АлексейНа сколько я понял, код Хемминга предусматривает работу с двоичными кодами и необходим для контроля передачи информации по контрольной сумме. Но не может застраховать от ошибок ввода.Вывод в одной точке и ввод в другой - это та же передача информации. Автор АлексейНо насколько я понял этот метод не подходит для этой задачи.Символы в строке у вас же все равно имеют двоичное представление. Вот для него и считайте контрольную сумму. Если вас смущает возможная нечитабельность полученных символов, то base64 (или аналогичный с другим выходным алфавитом) поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 20:31 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Автор АлексейИ как? :) Можете привести алгоритм? и его вычислительную сложность? Если этот алгоритм предусматривае предварительную выборку всех строк, сгенерированных до этого ид БД (например), то не подходит... таких строк будут миллионы.Сложность, увы, квадратичная. Т.е. при миллионах записей явно не пойдет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 20:32 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
хм, интересная задачка, стало интересно, начал искать в инете, случайно наткнулся на преобразование адама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. Расширил в экселе еще на один порядок, получилось: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Можно заметить закономерность: для матрицы 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 позициях. Остался вопрос, как выбирать эти Х позиций, чтобы уменьшить кол-во одинаковых «последовательностей» между смежными строками? Можно выбирать отличающиеся позиции «через одну»? И еще, если к матрице подставить снизу инвертированную, то можно пользоваться и такой «удвоенной». Пойдет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 23:47 |
|
||
|
генерация строки, устойчивой к ошибкам ввода
|
|||
|---|---|---|---|
|
#18+
Чего-то я не понял, а какой смысл в этой задаче? Если все это " необходимо для того, чтобы при вводе кодов вручную и опечатке, не получалось так, что пользователь ввел другой существующий код. " То увы, вас никакая уникальность кодов не спасет - оператор всегда может ошибиться строкой и набить не тот код просто потому что забыл линейку передвинуть. Задача забавна, но бессмысленна. В реальном мире это решается выпадающими списками и сканерами штрихкодов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 23:59 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35327893&tid=1345266]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 537ms |

| 0 / 0 |
