Форум: "Начинающим";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
Внизаналог Set Of Найти похожие ветки
← →
Вася (2010-01-28 11:19) [0]Уважаемые Мастера,
Посоветуйте аналог SET OF такой, чтобы значения элементов множества могли быть больше 255 (например, [1,5,100,3560]).
Плюс к тому, чтобы можно было изящно (без перебора элементов) проверить, входит ли значение некой переменной i в это множество.
По аналогии с set of:
If i in MySet then...
← →
Jeer © (2010-01-28 11:32) [1]Странного иной раз хочется ?
Как ты себе представляешь список без Итератора ?
← →
Anatoly Podgoretsky © (2010-01-28 11:58) [2]> Вася (28.01.2010 11:19:00) [0]
Ну посмотри TBits
← →
Вася (2010-01-28 12:12) [3]
> Как ты себе представляешь список без Итератора ?
А вдруг?! :) Видите, это все нужно для работы в связке с TTreeView. Поскольку у последнего (равно как и у TTreeNodes) нет методов поиска - возникают такие странные идеи. Потому как многократно обходить дерево итерацией очень не хочется...
← →
Вася (2010-01-28 12:16) [4]
> Ну посмотри TBits
Не то. В предполагаемом множестве нужно хранить совершенно конкретные integer-числа.
← →
Jeer © (2010-01-28 12:20) [5]
> А вдруг?! :)
Чудес не бывает.
Ну разве, что завести булевский массив максимальной нужной размерности и получать ответ сразу:
if inSet[i] then...
← →
Вася (2010-01-28 12:21) [6]
> Ну разве, что завести булевский массив максимальной нужной
> размерности
Спасибо за наводку, подумаю.
> Ну посмотри TBits
И вам спасибо. Почти "то". Первая поя реакция на ваше предложение была поспешной.
← →
MBo © (2010-01-28 14:14) [7]Если диапазон чисел очень широк, то хэш-таблица с точки зрения расхода памяти будет выгоднее, чем TBits
← →
Anatoly Podgoretsky © (2010-01-28 14:33) [8]> Вася (28.01.2010 12:16:04) [4]
Что мешает, только полное множество для Integer равно 512 мбайт
← →
Anatoly Podgoretsky © (2010-01-28 14:33) [9]> Jeer (28.01.2010 12:20:05) [5]
А здесь уже 4 гб нужно
← →
Jeer © (2010-01-28 15:02) [10]
> Anatoly Podgoretsky © (28.01.10 14:33) [9]
Дык я не знаю, сколько и каких там у него чисел - предложение имеет право на жизнь, когда не хочется думать о хэшах и пр.
← →
Anatoly Podgoretsky © (2010-01-28 15:27) [11]> Jeer (28.01.2010 15:02:10) [10]
Ну он явно назвал диапазон, это Integer
← →
Jeer © (2010-01-28 15:28) [12]> например, [1,5,100,3560]
Это еще не integer :)
← →
Jeer © (2010-01-28 15:30) [13]
> Не то. В предполагаемом множестве нужно хранить совершенно
> конкретные integer-числа.
Я понимаю, конечно, что заради общности можно упираться в края диапазона, а как там у него на самом деле - он и знает.
Да и вообще - какой-то намек на Tree - может и совсем по другому задача может быть решена.
← →
Вася (2010-01-28 16:06) [14]Мастера, ага. В множество должны добавляться значения поля типа AUTOINC из таблицы. Т.е. заранее невозможно угадать, каким будет максимальное значение элемента множества.
← →
Вася (2010-01-28 16:24) [15]Если вопрос вызвал интерес, давайте я попытаюсь четко сформулировать задачу.
Дано:
- Есть некий набор данных table1, откуда берётся значение поля ID
- Есть дерево, в Data каждого элемента также которого храниться значение ID
Надо: выделить все узлы дерева, у которых ID соответствует одному из ID из table1.
Понимаете, очень хочется уйти вот от этого:
while not table1.eof do
begin
for i:=0 to TreeView.Items.Count-1 do
if table1.ParamByName("ID").asInteger=Integer(TreeView.Items[i].Data)
then begin
// нашли, сохранили ссылку на найденный TTreeNode в массиве
breake
end;
table1.next
end;
TreeView.Select(массив с найденными узлами);
← →
Anatoly Podgoretsky © (2010-01-28 16:43) [16]> Jeer (28.01.2010 15:28:12) [12]
Я вообще про доступ по индекс говорил
← →
Anatoly Podgoretsky © (2010-01-28 16:44) [17]> Вася (28.01.2010 16:06:14) [14]
Известно заранее, это или High(Integer) или High(Cardinal) максимальнее этого быть не может.
← →
Jeer © (2010-01-28 17:05) [18]
> давайте я попытаюсь четко сформулировать задачу.
Обычно Tree является подмножеством выбранных записей и в этом случае id записи имеет один id в Tree.
Т.е. дерево строится как иерархическое представление линейной таблицы БД.
А у тебя что за соответствие ?
← →
Вася (2010-01-28 17:20) [19]
> А у тебя что за соответствие
А у меня один id из набора данных может соответствовать нескольким узлам дерева. Отношение "один ко многому".
← →
Jeer © (2010-01-28 17:26) [20]Странно но ладно.
Попробуй сканировать дерево и делать locate по базе.
← →
Вася (2010-01-28 17:30) [21]
> Попробуй сканировать дерево и делать locate по базе
Да, в моем случае это, пожалуй, наиболее приемлемый вариант. Спасибо!
← →
Евгений Р. (2010-01-28 20:56) [22]var sl:tStringList;
.........
sl.sorted:=true;
sl.add(IntToStr(n));
............
if sl.find(IntToStr(n),k) then ......
← →
Anatoly Podgoretsky © (2010-01-28 21:30) [23]> Евгений Р. (28.01.2010 20:56:22) [22]
Не доживет и до десятой доли диапазона Integer
← →
Евгений Р. (2010-01-28 23:14) [24]
> Anatoly Podgoretsky © (28.01.10 21:30) [23]
Неужели пользователю стоит показывать дерево с таким количеством листов?
← →
Anatoly Podgoretsky © (2010-01-28 23:46) [25]> Евгений Р. (28.01.2010 23:14:24) [24]
Я ничего не говорил про дерево и про его показ, с чего бы ты это приплел?
← →
Евгений Р. (2010-01-29 00:17) [26]Сопоставив конкретизацию вопроса автора [15] и Вашу реплику: "Не доживет и до десятой доли диапазона Integer". Или Вы о чем-то другом говорили?
← →
Anatoly Podgoretsky © (2010-01-29 00:30) [27]> Евгений Р. (29.01.2010 00:17:26) [26]
Ну попробуй, возьми десятую долю от диапазона, а это 400 000 000 чисел и попробуй добавить это в список, не обращая внимания на время. И посмотрим выживет ли или нет.
← →
Евгений Р. (2010-01-29 00:47) [28]Повторюсь:
Исходя из обсуждаемого вопроса ([15] Надо: выделить все узлы дерева, у которых... ), вряд ли количество элементов превысит тысячу. При нескольких тысячах записей предложенный алгоритм работает нормально. Не думаю, что автор пишет телефонный справочник Европы и хочет всех абонентов отобразить на одном экране
← →
Anatoly Podgoretsky © (2010-01-29 00:54) [29]> Евгений Р. (29.01.2010 00:47:28) [28]
Автор сам рамки поставил по диапазону Integer
Наша дело посчитать
← →
Евгений Р. (2010-01-29 01:09) [30]Ну можно и так
← →
Jeer © (2010-01-29 09:13) [31]На самом деле, лично для меня, появление вот таких задач, это, скорее всего, следствие ошибочной, не оптимальной архитектуры системы обработки и представления данных.
Ну да ладно - предположим в ней уже ничего менять нельзя.
Однако, если верно определение, что список уникальных id в Tree является подмножеством эквивалентных id в таблице, то задачу можно свести точно к линейной от N, а заодно и ускорить:
select * from table order by id
// Имеется список объектов, каждый из которых имеет свойства: id: integer, node: TTreenode и признак наличия в таблице БД: boolean;
// Для начала формируем из Tree линейный список
while not tree.eof do begin
lst.Add(id,tree.node,False);
tree.next;
end;
lst.Sort; // сортировка списка по id
// Сканируем список, а внутри - двухпозиционный автомат
// В итоге получаем "раскрашенный" список всех id
// Что делать дальше с ним - забота автора
while lst.eof do begin
while ( lst.id <> table.id ) do table.next;
while ( tree.item.id = table.id ) do begin
lst.set; // установка признака в True
lst.next;
end;
end;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.005 c