Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
3-1236248813
gnom
2009-03-05 13:26
2010.03.28
EhLib работа с данными


15-1262805333
Fenik
2010-01-06 22:15
2010.03.28
Нелегко быть президентом Украины


15-1262899825
Юрий
2010-01-08 00:30
2010.03.28
С днем рождения ! 8 января 2010 пятница


15-1262645563
Германн
2010-01-05 01:52
2010.03.28
Работа с Project Group


1-1246435353
iFynk
2009-07-01 12:02
2010.03.28
DLL и контролы





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