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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2010, 23:58   #1
Sarumjan
Пользователь
 
Аватар для Sarumjan
 
Регистрация: 29.11.2008
Сообщений: 46
Восклицание Поиск в отсортированной последовательности

В общем подкинули такую задачку, придумать или найти эффективный алгоритм поиска в отсортированной последовательности(то есть массив в котором хранятся числа). При этом не использовать обычный перебор и метод дихотомии(деление на пополам). Если кто то знает какой то алгоритм пишите названия, в общем буду рад любой помощи.
Все ошыбки, являются собственностью автора.
Copyright © 1990-2009
Мой проект
Sarumjan вне форума Ответить с цитированием
Старый 25.11.2010, 07:01   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

ИСПРАВЛЕНО

Пусть дан массив чисел A отсортированный по возрастанию. Найти номер элемента равного X
Код:
PredPred = -1;
Pred = -1;
Cur = -1;
Len = Длина (А);
Если Len = 0 тогода ВЫХОД;
Step = Len div 2;
Cur = Pred + Step;

Пока A[Cur] <> X
|  Step = Round (Step / 2);
|  PredPred = Pred
|  Pred = Cur
|  Если A[Cur] > X то Cur = Pred - Step;
|  иначе Cur = Pred + Step;
|  Если (Cur = PredPred) или (Cur < 0) или (Cur >= Len) то
|  |  Cur = -1;
|  |  Выход из цикла
|  конец условия
конец цикла
Результат = Cur

Добавлено --------------------------------------------------------------
В Delphi есть одна проблема. Round округляет X.5 до ближайшего кратного. Т.е. Round(0.5) = 0. Как от этого избавиться не помню, поэтому:
Код:
if Step = 0 then Step := 1;

Последний раз редактировалось Sibedir; 25.11.2010 в 07:48.
Sibedir вне форума Ответить с цитированием
Старый 25.11.2010, 08:27   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Sarumjan
При этом не использовать обычный перебор и метод дихотомии(деление на пополам).
Sibedir, а разве вот это:
Цитата:
Код:
Step = Round (Step / 2);
не метод деления пополам?


p.s. как решать задачу я не знаю...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.11.2010, 08:30   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Тьфу ты ну ты. А я прочитал: При этом не использовать обычный перебор, а метод дихотомии(деление на пополам).
Вот балда

Добавлено --------------------------------------------------------------
Бред, конечно, но можно и так:
Код:
var
  Len: Integer;
  IndexArr: array of Integer;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  Len := StrToInt (ListBox1.Items[ListBox1.Items.Count-1]);
  SetLength (IndexArr, Len+1);
  for i := 0 to Len do IndexArr[i] := -1;
  for i := 0 to ListBox1.Items.Count-1 do IndexArr[StrToInt (ListBox1.Items[i])] := i;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  X, R: Integer;
begin
  X := StrToInt (Edit1.Text);

  if (X < 0) or (X > Len) then
    R := -1
  else
    R := IndexArr[X];

  Edit2.Text := IntToStr (R);
end;
А если
Код:
var
  Max: Integer;
  IndexArr: array of Integer;

procedure TForm1.FormCreate(Sender: TObject);
var
  i, j: Integer;
begin
  Max := -1;
  for i := 0 to ListBox1.Items.Count-1 do begin
    j := StrToInt (ListBox1.Items[i]);
    if j > Max then Max := j;
  end;
  SetLength (IndexArr, Max+1);
  for i := 0 to Max do IndexArr[i] := -1;
  for i := 0 to ListBox1.Items.Count-1 do IndexArr[StrToInt (ListBox1.Items[i])] := i;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  X, R: Integer;
begin
  X := StrToInt (Edit1.Text);

  if (X < 0) or (X > Max) then
    R := -1
  else
    R := IndexArr[X];

  Edit2.Text := IntToStr (R);
end;
то это еще и для несортированного массива. Но если в массив длинной 1000 затясалось число 1000000000, то это сложно назвать эффективным алгоритмом.

Последний раз редактировалось Sibedir; 25.11.2010 в 09:02.
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск последовательности чисел в строке файла. Паскаль Vlasii Помощь студентам 10 14.11.2010 12:27
Определить:формат последовательности параметров & способ размещения последовательности переменных DenSyntax Помощь студентам 0 22.06.2010 17:26
Нужна база на mySQL(поиск в последовательности по частичке кода) Serg64 Фриланс 1 26.04.2010 12:07
Поиск в последовательности чисел упорядоченной подпоследовательности макс длины Rusl92 Помощь студентам 6 27.02.2010 00:02
Поиск последовательности цифр в строке mmx310 Microsoft Office Excel 14 05.02.2009 11:19