Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.05;
Скачать: [xml.tar.bz2];

Вниз

Поиск элемента в массиве   Найти похожие ветки 

 
Дас Виндовс 45   (2004-02-23 14:12) [0]

Нет ли более оптимального алгоритма для поиска некоторого элемента в массиве, чем сравнение через цикл?


 
Гаврила   (2004-02-23 14:20) [1]

если массив отсортирован, то есть метод дихотомии
пример смотри в VCL коде
TStringList.IndexOf


 
pasha_golub   (2004-02-23 14:21) [2]

Гаврила (23.02.04 14:20) [1]

Ну зачем такие матюки, сказал бы методом деления пополам :-)
Не все же консерватории заканчивали :-)


 
Defunct   (2004-02-23 14:23) [3]

Есть еще бинарный поиск, только массив должен быть предварительно отсортирован.

А алгоритм поиска выглядеть так:
1. Устанавливаем индекс начала массива на первый элемент массива, индекс конца - на последний.
2. Проверяем средний элемент между индексом начала и конца.
3. если меньше - смещаем индекс конца массива на этот элемент.
4. если больше - смещаем индекс начала массива на этот элемент.
5. Если индекс начала и индекс конца массива равны - поиск завершен, иначе повторяем искать с п.2


 
Дас Виндовс 45   (2004-02-23 14:27) [4]

А можно с примерами?
Или ссылочку.
А какой из них самый эффективный?

Спасибо.


 
Гаврила   (2004-02-23 14:33) [5]

>>Defunct © (23.02.04 14:23) [3]
похоже, это тоже самое, там так все и работает
>>Дас Виндовс 45 (23.02.04 14:27) [4]
Я же говорю, пример в VCL коде
>>pasha_golub © (23.02.04 14:21) [2]
уже и повыпендриваться нельзя :-)))


 
Defunct   (2004-02-23 14:45) [6]

Самый эффективный с хеш таблицами, толко он сложноват.
Пример бинарного поиска пожалуйста:
(не забывайте, массив должен быть предварительно отсортирован)

Var A:Array[1..100] Of Integer;

Function Found(Value:Integer):Boolean;
Var MinIndex,MaxIndex : Integer;
CurrentIndex : Integer;
Begin
MinIndex := 1;
MaxIndex := 100;
Result := False;
While (Not Result) And (MinIndex<>MaxIndex) And (MinIndex<MaxIndex-1) Do
Begin
CurrentIndex := (MinIndex + MaxIndex) Div 2;
If Value = A[CurrentIndex] Then Result := True Else
If Value < A[CurrentIndex] Then MaxIndex := CurrentIndex Else
If Value > A[CurrentIndex] Then MinIndex := CurrentIndex;
End;
End;

procedure TForm1.Button1Click(Sender: TObject);
Var I:Integer;
begin
For I:=1 To 100 Do A[i] := I*2;

If Found(58) Then ShowMessage("Найден")
Else ShowMessage("Не найден");
end;


 
Владислав   (2004-01-23 13:58) [7]

Какого размера массив? Как часто он изменяется?


 
Digitman   (2004-02-24 15:58) [8]


> Дас Виндовс 45 (23.02.04 14:12)


приведи конкр.пример объявления/иниц-ции массива - будут и рекомендации



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.03.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
1-12387
Иванко
2004-02-23 13:52
2004.03.05
Проблема у RichEdit c Charset (Глюки WIN XP???)


1-12349
Ivolg
2004-02-22 10:22
2004.03.05
Popupmenu?


3-12240
Lbvf1
2004-02-09 14:51
2004.03.05
Не могу сохранить int64 в поле bigint


1-12330
Budy
2004-02-20 05:22
2004.03.05
Про TImage


1-12448
_dEMOn
2004-02-22 21:18
2004.03.05
Skin





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский