Алгоритм сжатия 4 символов

Вы можете по существу сделать это двумя способами:

Маршрут .htaccess с mod_rewrite

Добавьте файл с именем .htaccess в корневую папку и добавьте что-то вроде этого:

RewriteEngine on
RewriteRule ^/?Some-text-goes-here/([0-9]+)$ /picture.php?id=$1

Это скажет Apache, чтобы включить mod_rewrite для этой папки, и если ему будет задан URL-адрес, соответствующий регулярному выражению, он переписывает его внутренне на то, что вы хотите, без конца пользователь посмотрев. Легко, но негибко, поэтому, если вам нужно больше энергии:

Маршрут PHP

Вместо этого вместо этого введите вместо этого .htaccess: (обратите внимание на ведущую косую черту)

FallbackResource /index.php

Это скажет, чтобы он запускал ваш index.php для всех файлов, которые он обычно не может найти на вашем сайте. Там вы можете, например:

$path = ltrim($_SERVER['REQUEST_URI'], '/');    // Trim leading slash(es)
$elements = explode('/', $path);                // Split path on slashes
if(empty($elements[0])) {                       // No path elements means home
    ShowHomepage();
} else switch(array_shift($elements))             // Pop off first item and switch
{
    case 'Some-text-goes-here':
        ShowPicture($elements); // passes rest of parameters to internal function
        break;
    case 'more':
        ...
    default:
        header('HTTP/1.1 404 Not Found');
        Show404Error();
}

Это то, как это делают большие сайты и CMS-системы, поскольку это позволяет гораздо большую гибкость в анализе URL-адресов, конфигурационных и зависимых от базы данных URL-адресов и т. Д. Для спорадического использования жестко закодированные правила перезаписи в .htaccess сделают все возможное.

-1
задан pkpnd 13 July 2018 в 22:41
поделиться

1 ответ

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

Минимальный объем информации, необходимой для хранения одного из 4 значений - всего 2 бита: 00, 01, 10 или 11 могут представлять 4 отдельных элемента на карте. Затем, если у вас есть n символов в вашей строке, вы можете преобразовать это в битовую строку длины 2n, например, строка 12313 становится битовой строкой 01 10 11 01 11 (с добавлением пробелов для ясности).

Если вы используете базовое кодирование строки 36 (используя 10 цифр плюс 26 символов), вы можете повернуть 5 бит за один раз в один символ (начиная с 2 ^ 5 = 32 и = 36). В результате получается строка из 2/5 * n символов или сжатие 2.5x по сравнению с вашей исходной строкой.

Вы можете выжать больше из этой технологии, используя другую кодировку с более разными символами. Например, 10 цифр + 26 букв в верхнем регистре + 26 строчных букв + 2 символа пунктуации = 64 символа, поэтому вы можете превратить 6 бит в один печатный символ ASCII с использованием такого типа кодирования.


Если распределение элементов очень искажено (например, 0 очень распространено, а 1, 2 и 3 очень редки), то вы можете взглянуть на кодировку Хаффмана . Однако я предлагаю сначала использовать описанный выше подход, поскольку он намного проще и понятнее.

0
ответ дан pkpnd 17 August 2018 в 12:06
поделиться
  • 1
    Я также подумал о 2-битном представлении, но не знал кодировку base 36. Спасибо за совет! – Unknown Joe 13 July 2018 в 22:53
  • 2
    Вы можете выжать больше из этой техники, используя другую кодировку с более четкими символами. Например, 10 цифр + 26 букв в верхнем регистре + 26 строчных букв + 2 символа пунктуации = 64 символа, поэтому вы можете превратить 6 бит в один печатный символ ASCII. – pkpnd 13 July 2018 в 22:55
  • 3
    Зачем ограничивать его печатными символами ASCII? – ruakh 13 July 2018 в 23:03
  • 4
    @ruah Если есть ограничение на то, что кодировка будет String (в отличие от битовой строки или массива 8-битных символов), тогда обычно лучше не иметь непечатаемых символов, чтобы вы могли узнать, что происходит ... – pkpnd 13 July 2018 в 23:36
  • 5
    @pkpnd: Я не вижу никаких доказательств такого ограничения в вопросе. (И обратите внимание, что этот вопрос не помечен каким-либо конкретным языком, существуют языки, где массивы восьмибитовых символов & quot; являются "строками".) – ruakh 13 July 2018 в 23:41
Другие вопросы по тегам:

Похожие вопросы: