Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закодировать массив, Возможно нереально 
:(
    Опции темы
Fixin
Дата 20.1.2004, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Люди?!! Есть, естественно, проблема - дан массив из n элементов от 0 до n. Нужно превратить это все
в что-то по короче - то, что можно записать вручную, ну на бумаге хотябы. И из этой записи потом все восстановить - теже числа и на томже месте, если это реально?
P.S.
Массив - бывший упорядоченный, в котором в каждой ячейке жранился его номер, а потом все перемесили, но без утрат - это так, может поможет.
PM MAIL ICQ   Вверх
maxim1000
Дата 20.1.2004, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



ну сохранять напрямую весь массив, действительно, избыточно
если это делать, нужно записать одно из n^n чисел
всего же различных комбинаций - n!, что намного меньше
таким образом, нужно просто перевести сведения о порядке элементов в одно число
сделать это можно, например, так:
Код
int encode(CSomeArray array)
{
 int n,i;

 n=array.Length();
 i=array.Find(n-1);
 array.Cut(i);
 return i+n*function(array);
};

класс CSomeArray - придуман для наглядности алгоритма
методы:
Length() - возвращает длину массива
Find(x) - ищет элемент x в массиве и возвращает его индекс
Cut(i) - вырезает элемент с индексом i (длина приэтом уменьшается на 1)
Insert(x,i) - вставляет элемент x в позицию с номером i (все, что после него - сдвигается)

на самом деле здесь реализован просто перевод числа в другую систему счисления
особенностью является переменное основание этой системы:
для младшего разряда оно=1
для старшего - n
число записывается так:
0*1+i1*1*2+i2*1*2*3+i3*1*2*3*4+...
i1 - положение 1 в массиве, который получится после выкидывания всех чисел кроме 0 и 1
i2 - положение 2 в массиве из 0,1,2
...

декодировать можно так:
Код
CSomeArray decode(int x,int n)
{
 CSomeArray result;
 int i;
 int nn;

 for(i=0;i<n;i++)
   result.Insert(i,x%(i+1));
 return result;
};

может, что-нибудь и напутал, но, надеюсь, алгоритм понятен


--------------------
qqq
PM WWW   Вверх
acp
Дата 21.1.2004, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

Репутация: нет
Всего: 2



Цитата
Массив - бывший упорядоченный, в котором в каждой ячейке жранился его номер, а потом все перемесили, но без утрат

Не понимаю. Массив был такой [1, 2, 3, ..., n]?
Известна может быть последовательность перемешивания?
Если да, то можно её записывать.
Если нет, то её можно попробовать отыскать.
Можно попробовать какие-нибудь методы сжатия простейшие

Цитата
таким образом, нужно просто перевести сведения о порядке элементов в одно число

Прикольно придумано smile.gif
Ещё здесь можно использовать не только "циферное" представление числа, но и "символьное". Т.е. использовать буквы латинского алфавита.

PM WWW ICQ   Вверх
maxim1000
Дата 21.1.2004, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата
Ещё здесь можно использовать не только "циферное" представление числа, но и "символьное". Т.е. использовать буквы латинского алфавита.

результатом работы вышеописанного алгоритма является число
а его можно выводить уже в системе счисления любого постоянного основания
действительно, можно за основание взять, например, 36 (цифры+латинские буквы) или 62(+большие)

Это сообщение отредактировал(а) maxim1000 - 21.1.2004, 11:09


--------------------
qqq
PM WWW   Вверх
Fixin
Дата 21.1.2004, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Цитата
Известна может быть последовательность перемешивания?


Нет, замесь производится рандомом.

Цитата
return i+n*function(array);


function(CSomeArray array) - это что, или я не все догоняю, мне-то далеко до толковых прог-мистов.

Это сообщение отредактировал(а) Fixin - 21.1.2004, 20:23
PM MAIL ICQ   Вверх
maxim1000
Дата 22.1.2004, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата
function(CSomeArray array) - это что, или я не все догоняю, мне-то далеко до толковых прог-мистов.

это - ничего страшного, это - моя ошибка smile.gif
просто я сначала писал только функцию кодирования и, чтоб долго не думать, обозвал ее function
потом я вспомнил, что неплохо было бы ее и раскодировать smile.gif, и переобозвал функцию кодирования encode, а в рекурсивном вызове заменить забыл...


--------------------
qqq
PM WWW   Вверх
Fixin
Дата 22.1.2004, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Точно! надо было подумать!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1047 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.