Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.28;
Скачать: CL | DM;

Вниз

аналог 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.015 c
15-1262879478
Kerk
2010-01-07 18:51
2010.03.28
Проект минздравсоцразвития РФ


15-1263047943
AlexDan
2010-01-09 17:39
2010.03.28
Kepler ищет планеты..


6-1215513539
kolj
2008-07-08 14:38
2010.03.28
Передача файла через HTTP протокол


2-1264589400
helluvaname
2010-01-27 13:50
2010.03.28
объявление функции DateOf


15-1262554228
Юрий
2010-01-04 00:30
2010.03.28
С днем рождения ! 4 января 2010 понедельник