![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Массивы [D5]
nimble © (2002-03-20 08:06:00)Вопрос такого плана, допустм есть массив из 50 элементов. Я пробегаю по нему, ищя нужный элемент, если есть то удаляю, нет - начинеам с начала искать другой элемент. Вопрос как сделать так тобы размер массива уменьшался? Удалил элемент массив с 50->49, чтобы по сто раз не бегать от 0 до 50.
MBo (2002-03-20 13:46:00) [1]кстати, уже спрашивали, важен ли порядок следования - так как?
AFROLOV (2002-03-20 13:43:00) [2]1. Может есть смысл элементы не удалять(достаточно долгая операция) а выставлять ему флаг удаленный? Для сложных элементов (структуры, объекты) и сложных критериев сравнения это может быть оправданно.
2. Для увеличения скорости работы может их полезно отсортировать?
Поиск по отсортированному списку может быть организован очень быстро (например методом дихотамии).
3. Построить над ними индекс как в БД.(это уже совсем извратно)
MBo (2002-03-20 13:12:00) [3]IMHO, общие принципы:
1) маленькие элементы - динамический массив
2) большие элементы, нечастое удаление - TList и т.п.
3) много больших элементов, частое удаление - можно подумать о связанном списке
С TList в первую очередь надо проверить - если скорость устроит (при удалении), то это самое удобное
nimble (2002-03-20 10:24:00) [4]Массив представляет собой структуру, там всего по немногу и числа, и строки и boolean. То для выборки конкретного поля потребуется не меньше мук!
Андрей Сенченко (2002-03-20 10:22:00) [5]nimble © (20.03.02 10:18)
Что - указатель на каждый из "около 5 тыс" элементов ?
Может при таких объемах действительно положиться на TList или TStrigs ?
nimble (2002-03-20 10:18:00) [6]Ну по поводу 50 элементов это пример, а на самом деле их около 5 тыс.
А как насчет указателей, идей ни у кого нет?
Vogul (2002-03-20 09:36:00) [7]Связанные списки - гибко и красиво.
Doom (2002-03-20 09:25:00) [8]
> nimble
> Я и так использую динамические, а как это осуществить, можно
> по подробнее!
Если будешь использовать динамические то самому придется с памятью возиться. Так что лучше TList. А есть также хорошее решение: использовать TStrings. Поиск будет идти несколько медденне но зато красиво получится (Опять же - таки смотря для чего это нужно)
Андрей Сенченко (2002-03-20 09:22:00) [9]Если порядок следования элементов массива Тебя не волнует - просто заменяй. Для динамического массива это будет выглядеть примерно так:
1. Удалить i-ый элемент
2. Взять верхнюю границу массива
3. Приравнять i-ый элемент последнему.
4. Удалить последний и уменьшить верхнюю границу на 1
По-моему так
MBo (2002-03-20 09:22:00) [10]Move(a[N+1],a[N],(length(a)-n)*SizeOf(AElement));
setlength(a,length(a)-1);
Андрей Сенченко (2002-03-20 09:18:00) [11]>> nimble © (20.03.02 09:12)
>> Удалять и сдвигать требует времени :(
Не так уж и много, как может показаться. По крайней мере при объявленных Тобой 50-ти элементах.
nimble (2002-03-20 09:12:00) [12]->Song
Удалять и сдвигать требует времени :(
->Song
Я и так использую динамические, а как это осуществить, можно по подробнее!
Song (2002-03-20 08:23:00) [13]удаляй и сдвигай
MBo (2002-03-20 08:12:00) [14]используй списки (TList) или динамические массивы