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




Вниз

Массивы 


nimble   (2002-03-20 08:06) [0]

Вопрос такого плана, допустм есть массив из 50 элементов. Я пробегаю по нему, ищя нужный элемент, если есть то удаляю, нет - начинеам с начала искать другой элемент. Вопрос как сделать так тобы размер массива уменьшался? Удалил элемент массив с 50->49, чтобы по сто раз не бегать от 0 до 50.



MBo   (2002-03-20 08:12) [1]

используй списки (TList) или динамические массивы



Song   (2002-03-20 08:23) [2]

удаляй и сдвигай



nimble   (2002-03-20 09:12) [3]

->Song
Удалять и сдвигать требует времени :(

->Song
Я и так использую динамические, а как это осуществить, можно по подробнее!



Андрей Сенченко   (2002-03-20 09:18) [4]

>> nimble © (20.03.02 09:12)
>> Удалять и сдвигать требует времени :(


Не так уж и много, как может показаться. По крайней мере при объявленных Тобой 50-ти элементах.



Андрей Сенченко   (2002-03-20 09:22) [5]

Если порядок следования элементов массива Тебя не волнует - просто заменяй. Для динамического массива это будет выглядеть примерно так:
1. Удалить i-ый элемент
2. Взять верхнюю границу массива
3. Приравнять i-ый элемент последнему.
4. Удалить последний и уменьшить верхнюю границу на 1

По-моему так



MBo   (2002-03-20 09:22) [6]

Move(a[N+1],a[N],(length(a)-n)*SizeOf(AElement));
setlength(a,length(a)-1);



Doom   (2002-03-20 09:25) [7]


> nimble
> Я и так использую динамические, а как это осуществить, можно
> по подробнее!


Если будешь использовать динамические то самому придется с памятью возиться. Так что лучше TList. А есть также хорошее решение: использовать TStrings. Поиск будет идти несколько медденне но зато красиво получится (Опять же - таки смотря для чего это нужно)



Vogul   (2002-03-20 09:36) [8]

Связанные списки - гибко и красиво.



nimble   (2002-03-20 10:18) [9]

Ну по поводу 50 элементов это пример, а на самом деле их около 5 тыс.
А как насчет указателей, идей ни у кого нет?



Андрей Сенченко   (2002-03-20 10:22) [10]

nimble © (20.03.02 10:18)

Что - указатель на каждый из "около 5 тыс" элементов ?
Может при таких объемах действительно положиться на TList или TStrigs ?



nimble   (2002-03-20 10:24) [11]

Массив представляет собой структуру, там всего по немногу и числа, и строки и boolean. То для выборки конкретного поля потребуется не меньше мук!



MBo   (2002-03-20 13:12) [12]

IMHO, общие принципы:
1) маленькие элементы - динамический массив
2) большие элементы, нечастое удаление - TList и т.п.
3) много больших элементов, частое удаление - можно подумать о связанном списке
С TList в первую очередь надо проверить - если скорость устроит (при удалении), то это самое удобное



AFROLOV   (2002-03-20 13:43) [13]

1. Может есть смысл элементы не удалять(достаточно долгая операция) а выставлять ему флаг удаленный? Для сложных элементов (структуры, объекты) и сложных критериев сравнения это может быть оправданно.
2. Для увеличения скорости работы может их полезно отсортировать?
Поиск по отсортированному списку может быть организован очень быстро (например методом дихотамии).
3. Построить над ними индекс как в БД.(это уже совсем извратно)



MBo   (2002-03-20 13:46) [14]

кстати, уже спрашивали, важен ли порядок следования - так как?




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




Наверх





Память: 0.74 MB
Время: 0.029 c
7-331             Hel                   2001-12-27 09:44  2002.04.01  
CD-ROM


1-216             nimble                2002-03-20 08:06  2002.04.01  
Массивы


6-265             Malder                2002-01-19 13:39  2002.04.01  
Перехват Socket соединения


4-342             kiber                 2002-01-31 01:17  2002.04.01  
win api


3-57              sevylor               2002-03-08 05:30  2002.04.01  
clone