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

Вниз

Быстрый пойск в масиве   Найти похожие ветки 

 
Arazel ©   (2005-11-01 17:56) [0]

Помогите сэтим разобратся...

У меня есть масив содержащий в себе уникальные значение!
И своевременно масив увиличивается или уменьшается...

теперь я хочу спросить как  получить прямой доступ
к определнному индексу масива если имея уникальное значение
которое содержится в масиве!

Сразу говорю:
- Объем масива неизвестен
- Где адрес(index) значение тоже неизвестно
- Масив может менять размер -/+
+ У нас есть значение которое хранится в масиве

Пока я пользуюсь методом перебора (For do)
но это слишком медленно для масива размером 10000 Int64
да ещё программа "гонит" при таком пойске...

Как можно моментально найти?


 
Ораклиный глаз   (2005-11-01 18:41) [1]

Если массив несортирован, то забудь.


 
programania ©   (2005-11-01 19:54) [2]

У меня 1000 000 int64  проверяет весь за 16 милиСек на C2800
если это не мгновенно то на asm можно
довести до 3-ех машинных команд на элемент


 
Arazel ©   (2005-11-01 19:59) [3]

Ну  покажи как ты это  делаешь.


 
programania ©   (2005-11-01 21:49) [4]

Когда выделил в отдельную процедуру стало еще быстрее
за 3.7 мСек так что getTickCount не поспевает
пришлось повторить 100 раз

{$R-,B-}
var
mt:array[1..1000000] of int64;
nz:int64;
tc,time:cardinal;

procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
for i:=1 to 1000000 do mt[i]:=random(1000000000);
ln:=mt[999990];
tc:=getTickCount;
nz:=0;
for j:=1 to 100 do
for i:=1 to 1000000 do if mt[i]=ln then begin
 nz:=i;
 break;
end;
time:=getTickCount-tc;
showMessage("Нашла "+intToStr(nz)+#13+intToStr(time)+" мсек");
end;


 
PAVIA ©   (2005-11-01 23:54) [5]

Можно и моментально найти.
Только не много массив переделать.
Берем массив заданного размера. Пусть Max=10000. В качестве элемента массива делаем список.
type
PElement=^TElement;
TElement=record
  Next:PElement;
  id:int64;
  end;
var
a:array [0..Max-1]:PElement;

Пешим хэш-функцию. она должна равномерно распределять элементы в массиве. К примеру такую:

function Hesh(a:int64):integer;
var a,h,i:integer;
p:pchar;
begin
p:=@a;
h:=0;
for i:=0 to 7 do // проходим по всем байтам int64
h:=(h*314+byte(p[i])) mod Max;
end;

Для добавления( поиска) в массив делаем функцию которая будет заносить(забирать) значение в клетку(из клетки) с номером который мы получим от хеш.
a[Hesh(id)]
Функции напишишь сам.
Список нужен, чтобы обработать коллизии- столкновения в результате получения одинаковых Hesh.



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

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

Наверх




Память: 0.45 MB
Время: 0.04 c
5-1111751604
Gennadiy
2005-03-25 14:53
2005.11.20
Проблема с созданием компонента!


14-1130195349
TButton
2005-10-25 03:09
2005.11.20
[anti]ArtMoney


3-1128938404
Boogier
2005-10-10 14:00
2005.11.20
Delphi+Ado+Access+Действительное поле = несоответствие типов данн


14-1130737263
Ega23
2005-10-31 08:41
2005.11.20
С днем рождения! 31 октября


2-1131082890
Ezorcist
2005-11-04 08:41
2005.11.20
Устаовка события для компонента





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский