Необходим алгоритм сжатия
Создана: 05 Апреля 2011 Втр 11:33:44.
Раздел: "Компьютерная безопасность, коды, доступы и т.д."
Сообщений в теме: 27, просмотров: 10523
-
Есть такая задача: строка символов длиной от 6 до 32 знаков, может состоять из букв a-z, цифр 0-9 и трех знаков -._(тире, нижний подчерк и точка). Необходимо перевести эту строку в числовую, то есть типа 096583932047 и максимально ее сжать по длине, но чтобы потом можно было обратными действиями восстановить начальную строку. Кто нибудь подскажет каким образом это возможно сделать?
-
-
ну тогда как и говорили - ужать каждый символ до 6 бит и закодировать.
но тогда получится на каждый байт нужно будет вводить 2-3 цифры с клавиатуры телефона.
Еще дурацкий вариант - закодировать каждый символ 2мя цифрами - клавиша телефона и сколько раз ее нажать надо чтобы получился нужный символ (буквы которые под цифрами на тел. написаны), может получится и покороче. -
-
каждый символ нумеруется от 0 до 38, чтобы их закодировать в двочиной системе, нужно 6 бит на каждый символ, выстраиваем эти биты подряд и "нарезаем" по 8 - и эти байты кодируем.
Но это все хорошо, когда требуется получить бинарный поток.
Здесь же вам нужно фактически представить 39 различных символов алфавитом из 12 символов (кнопки на телефоне). В связи с этим пришла в голову такая идея:
9 наиболее часто используемых символов закодировать одной кнопкой телефона (0-8 например), а остальные - двумя нажатиями ("9","*","#" + еще какие то кнопки.) - фактически это некоторая адаптация алгоритма Хаффмана с фиксированным деревом.
Для раскодировки смотрим символ в строке - если это символ из диапазона "0-8" - то берем из таблицы букву соответствующую, если "9" или "*" или "#" - то смотрим следующий символ и по нему берем так же букву из таблицы.
P.S. - можно в принципе построить и полный алгоритм Хаффмана с использованием 12 кнопок, но не факт что полная реализация даст существенно большее сжатие.
Для построения частоты использования букв самое шикарное - это нарыть базу логинов, на худой конец - можно просто словарь какой нибудь проанализировать ) -
Вот что высчитал с мощью математики и php:
для кодирования 1 символа из логина скайпа(a-z0-9*-_) необходимо где-то от 1.52 до 1.71 символов набранных на телефоне(0-9*#)
Откуда я взял от 1.52 до 1.71 ?
Я высчитал кол-во возможных значение логина скайпа длиной N символов и количество длины полученного кода из (0-9*#), необходимого для набора этого лоигина длиной N символов, сохраняя уникальность (без потерь).
Получается такая таблица:
Длина логина скайпа - кол-во символов набранных, на телефоне
6 -10
7 - 12
8 -13
9 - 15
10 - 16
32 - 49
Написал функцию на php работает , только есть проблема:
Там слишком большие числа и нужно использовать специальные функции.
Сделял я так:
Для логина скайпа у нас 39 символов (a-z0-9*-_). Создал таблицу символов, в которой каждому символу я присвоил десятичный номер от 11 до 49
Алгоритм функции перевода логина скайпа в символы набора на телефоне:
1) Перевожу логин в последовательность чисел, используя вышеупомянутую таблицу символов. Получается десятичное число.
2)Перевожу полученное десятичное число в двенадцатеричное.
Алгоритм перевода такой же как и с шестнадцатеричным. Только делим вместо 16 на 12; Т.к. цифр тут 12 то буквы c, d, e, f не нужны, а вместо буквы a - ставлю *, вместо b - #
Обратная функция перевода работает соответственно в порядке наоборот.
И еще насчет сжатия.
Т.к. логинов скайпа меньше 6 символов нет:
Возможно после получения десятичного числа его можно уменшить в размере, используя например деление, или еще какую арифметическую функцию.
Но пока этого не придумал. Для этого нужно учесть то, что всегда должно получится уникальное число (без потерь и колизий). -
Существует два больших класса алгоритмов сжатия без потерь:
1. частотные алгоритмы, использующие разницу в частоте символов и кодирующие более часто встречающиеся символы меньшим количеством битов;
2. алгоритмы замены повторяющихся последовательностей.
Второй вид алгоритмов на коротких строках текста выигрыша не дают. Поэтому логично использовать первый вид алгоритмов.
Среди частотных алгоритмов наилучшие - хафмэн и арифметическое кодирование.
Арифметическое кодирование даёт лучший результат, только
а) нужно правильно его написать,
б) реализации наврняка будут нарушать пару-тройку патентов IBM.
Если взять в качестве словаря ((a-z),(0-9),{._-}) и в качестве результирующего словаря ((0-9),{#*}), то, например слово 'abrakadabra' будет закодировано словом 000801142222928. Неоптимизированный алгоритм видел в журнале "Мир ПК" за примерно 1993 год, но думаю лучше поискать в интернете. -
-
Сотрудниками отдела «К» ГУВД по Свердловской области пресечена деятельность организованной преступной группы, создавшей нелегальный канал связи для осуществления международных телефонных звонков в Китай и междугородных звонков по России. Ущерб от действий злоумышленников составил более 10 млн. рублей.
Преступный замысел возник еще в 2007 году. Организатор, гражданин Китая, обратился к двум квалифицированным российским специалистам с просьбой о создании канала связи для осуществления международных телефонных звонков в Китай. Для этого он приобрел специальное оборудование, позволяющее преобразовывать звонок с мобильного телефона в Интернет - трафик и посредством глобальной сети отравлять его в любую точку мира, где работает подобное устройство. Аналогичное оборудование было установлено в Китае, куда в дальнейшем и выехал предприимчивый китаец для приема входящего трафика.
Для получения услуги необходимо было приобрести карту оплаты, на которой указывалось несколько телефонов и подробная инструкция. Желающие позвонить набирали один из номеров и следовали инструкциям автоответчика на китайском языке для соединения с нужным абонентом. После окончания телефонного соединения происходила тарификация звонка и списание денежных средств. Стоимость телефонного звонка составляла всего 1,5 рубля за минуту.
Организацией торговой сети по сбыту карт оплаты среди граждан Китая, находящихся на территории Свердловской области, занялась подруга организатора, в обязанности которой входила оплата телефонных счетов сотовых компаний, учет проданных карт оплаты и распределение прибыли среди других участников ОПГ.
В результате проведенных обысков на «узле связи» и по адресам проживания подозреваемых обнаружены и изъяты: программно-аппаратный комплекс, позволяющий оказывать услугу ip-телефонии; более одной тысячи сим-карт, договоры об оказании услуг связи, специальное устройство, позволяющее использовать сим-карты операторов сотовой связи в качестве шлюза для доступа в Интернет; договоры на производство карт оплаты, бумажные записи о ведении учета денежных средств, поступающих от преступной деятельности.
По данному факту СЧ ГСУ при ГУВД по Свердловской области возбуждено уголовное дело по признакам состава преступления, предусматривающего ответственность по ч.2 ст.171 УК РФ (незаконное предпринимательство). Трое участников ОПГ задержаны, им предъявлено обвинение в совершении преступления.
Пресс-служба Управления «К» МВД России -
-
taurus_xxl писал(а) : Неужели нету уже готового алгоритма?
Наверняка где-то есть. Я "на коленке" сваял.
Кстати, в прошлом письме я немного ошибся. Результат адаптивного алгоритма с весовыми коэффициентами 1 и приращением 1 даст 00288#*61162*15.
Но не слишком ли много цифр получается?
И ещё один момент: код не будет полностью однозначным - если вместо последней 5 поставить 4 или 6, алгоритм раскодировки даст то же самое слово.
И ещё в начало нужно одну-две цифры добавить под длину слова. -
да братан конечно .... не вопрос....taurus_xxl писал(а) :
P.S. Я никакой коммерческой деятельности не веду, соответственно и не ухожу от налогов, и никакие карты оплпты не произвожу.
taurus_xxl писал(а) : Я на своей АТС хочу сделать звонки с мобильных на Skype. С клавиатуры мобильника невозможно набрать логин скайпа, поэтому необходимо что то типа калькулятора, в который вводишь логин скайпа а он выдает числовую последовательность. Человек дозванивается на номер шлюза и вводит эту последовательность, моя атс ее декодирует и соединяет с нужным абонентом скайпа.
taurus_xxl писал(а) :Кто поможет мне с этой идеей тот получит возможность совершать звонки скайп<->мтс омск совершенно бесплатно (срок обговорим)
срок с вами следователь обговорит,особенно если трафик через мтс пойдет.Китайцы вот тоже думали...впрочем не только китайцы.
я собственно ниче не понял ! вы когда врали? в начале или сейчас? -