Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2010, 08:48   #1
alykaa
Пользователь
 
Регистрация: 01.12.2010
Сообщений: 12
По умолчанию Имеется массив из n чисел от 0 до (2 в степени k) - 1, каждое из которых мы будем рассматривать как k-бит

помогите, пожалуйста, решить задачку. Имеется массив из n чисел от 0 до (2 в степени k) - 1, каждое из которых мы будем рассматривать как k-битовое слово. Используя проверки "i-ый бит равен 0" и "i-ый бит равен 1" вместо сравнений, отсортировать все числа за время порядка n*k.
alykaa вне форума Ответить с цитированием
Старый 03.12.2010, 09:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ух ты... Чем дальше в лес тем методички извращеннее становятся...
Можешь пояснить на пальцах условие... Я не сильно понял
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.12.2010, 15:50   #3
alykaa
Пользователь
 
Регистрация: 01.12.2010
Сообщений: 12
По умолчанию

я сама не сильно поняла, но как мне сказали надо почитать цифровую сортировку, и типа сравнивать по битам 1 и 0
alykaa вне форума Ответить с цитированием
Старый 03.12.2010, 16:00   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
за время порядка n*k.
Вот это мне не понятно...
Допустим если взять банальную сортировку то:
Код:
for i:=1 to 10 do begin
 for j:=1 to 10 do begin
  if (a[i] and e)<(a[j] and e) then begin
   temp:=a[i];a[j]:=a[i];a[i]:=temp;
  end;
 end;
end;
А типа так...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.12.2010, 16:09   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

1.собрать слева (0*****) и справа (1*******) и точка раздела n1
за один проход цикла (N) (вполне реализуемо).
затем
2.1 (00****) (01****) до n1(там где у нас (0******)) и точка n21
2.2. (10****)(11****) от n1(там где у нас (1******)) b точка n22
еще один проход цикла (n1 +(N-n1) =N)
....
K.1
k....
k.2^k
последний проход цикла (N)
итого N*K.

принципальная схема реализации одного из перечисленных выше пунктов (без определения точек раздела n1,.... ).
Код:
i:=0;
j:=n-1;
m:=1 shl k;
while i<j do
begin
  if (a[i] and m) =0 then begin i:=i+1; continue; end;
  if (a[j] and m)>0 then begin j:=j+1; continue; end;
  r:=a[i]; a[i]:=a[j]; a[j]:=r; 
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.12.2010 в 16:13.
evg_m вне форума Ответить с цитированием
Старый 05.12.2010, 00:12   #6
alykaa
Пользователь
 
Регистрация: 01.12.2010
Сообщений: 12
По умолчанию

evg_m, не могли бы Вы более подробно написать, потому,что я сама не программист, и мне немного тяжеловато
alykaa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сложение 2-х чисел из диапазона 10 в 50 степени helenvintage Общие вопросы C/C++ 5 07.06.2010 21:32
Текстовый файл -> массив бит darel Общие вопросы .NET 1 28.04.2010 15:09
Нахождение в столбце с числами строк, сумма чисел которых равна определенному значению KNatalia Microsoft Office Excel 2 16.09.2009 08:42
подсчитать сколько раз встретилось каждое из чисел Х - бейсик Аля Самойлова Помощь студентам 12 11.05.2009 13:41
Delphi:Определить имеется ли среди чисел a,b,c хотя бы одна пара взаимно противоположных чисел. Skvot Помощь студентам 6 27.04.2009 11:47