В чем преимущество SortedDictionary ?
От: Аноним  
Дата: 07.01.11 02:21
Оценка:
Кэп подсказывал что SortedDictionary должен быстрее осуществлять поиск элемента по ключу, т.к. по нему осуществляется сортировка.

Провел тест, оказались странные результаты

для SortedDictionary

Добавление закончено, за время 00:00:01.1544021 с.
Поиск закончен, за время 00:00:00.8580015 с.


для обычного Dictionary

Добавление закончено, за время 00:00:00.1404002 с.
Поиск закончен, за время 00:00:00.0624001 с.


Получается что обычный Dictionary раз в 10 быстрее как на добавление , так и на поиск по ключу. В чем преимущество SortedDictionary тогда ?

static void Main(string[] args)
{
var dict = new SortedDictionary<int,int>();

DateTime start = DateTime.Now;

for (int i = 1000000; i >=0; i--)
{
dict[i] = 0;
}

Console.WriteLine("Добавление закончено, за время {0} с.",
(DateTime.Now — start));


start = DateTime.Now;
for (int i = 0; i <= 1000000; i++)
{
if (dict.ContainsKey(i))
dict[i] = i;
}

Console.WriteLine("Поиск закончен, за время {0} с.",
(DateTime.Now — start));


Console.ReadKey();
}

Re: В чем преимущество SortedDictionary ?
От: Kerbadun  
Дата: 07.01.11 02:36
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Кэп подсказывал что SortedDictionary должен быстрее осуществлять поиск элемента по ключу, т.к. по нему осуществляется сортировка.

А>Получается что обычный Dictionary раз в 10 быстрее как на добавление , так и на поиск по ключу. В чем преимущество SortedDictionary тогда ?

Dictionary — хеш-таблица со средним временем поиска O(1), SortedDictionary — красно-черное дерево со средним временем поиска O(log N).

Обобщенно рассуждая, я бы сказал, что SortedDictionary медленнее потому, что оно накладывает более сильное ограничение на множество — требует упорядоченности.

А>В чем преимущество SortedDictionary тогда ?


Кэп подсказывает нам, что преимущество SortedDictionary в том, что оно сортированное.


Когда он умрет, его мозг заспиртуют в стакане
Re: В чем преимущество SortedDictionary ?
От: Lloyd Россия  
Дата: 07.01.11 02:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Кэп подсказывал что SortedDictionary должен быстрее осуществлять поиск элемента по ключу, т.к. по нему осуществляется сортировка.


У вас какой-то неправильный кэп. Поиск в хэш-таблице всегда быстрее, чем в отсортированной коллекции.

А>Получается что обычный Dictionary раз в 10 быстрее как на добавление , так и на поиск по ключу. В чем преимущество SortedDictionary тогда ?


Преимущество в том, что он хранит ключи в отсортированном порядке и если часто нужно будет выводить значения в этом порядке, то это дбудет гораздо быстрее, чем сортировать их каждый раз.
Re[2]: В чем преимущество SortedDictionary ?
От: Аноним  
Дата: 07.01.11 02:43
Оценка: -1
Здравствуйте, Kerbadun, Вы писали:

А>>В чем преимущество SortedDictionary тогда ?


K>Кэп подсказывает нам, что преимущество SortedDictionary в том, что оно сортированное.

K>

Это конечно здорово , только зачем нам сортировка ради сортировки ?
Обычно сортировка используется чтобы потом можно было элемент найти быстрее, а тут на порядок медленее.
Переформулирую — в чем тогда преимущество Red-Black-Tree перед хеш таблицей
Re[3]: В чем преимущество SortedDictionary ?
От: Lloyd Россия  
Дата: 07.01.11 02:47
Оценка: +2
Здравствуйте, Аноним, Вы писали:

А>Это конечно здорово , только зачем нам сортировка ради сортировки ?

А>Обычно сортировка используется чтобы потом можно было элемент найти быстрее, а тут на порядок медленее.

Сортировка используется еще и тогда, когда по каким-то причинам нужны данных в отсортированном виде. (c) Кэп.
Re[2]: Асимптотика вставки
От: Qbit86 Кипр
Дата: 07.01.11 02:56
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Преимущество в том, что он хранит ключи в отсортированном порядке и если часто нужно будет выводить значения в этом порядке, то это дбудет гораздо быстрее, чем сортировать их каждый раз.


Преимущество в том, что вставка в SortedDictionary всегда занимает (асимптотически) одно и то же время — O(log n).

В (Hash)Dictionary вставка в основном производится за константное время, но в некоторые моменты происходит перестройка хэш-таблицы за линейное время (когда отношение количества элементов к количеству бакетов превышает порог).
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Примерить китель капитана
От: Qbit86 Кипр
Дата: 07.01.11 02:59
Оценка:
Не поминайте Кэпа всуе.
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: В чем преимущество SortedDictionary ?
От: Kerbadun  
Дата: 07.01.11 03:02
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Это конечно здорово , только зачем нам сортировка ради сортировки ?

А>Обычно сортировка используется чтобы потом можно было элемент найти быстрее, а тут на порядок медленее.
А>Переформулирую — в чем тогда преимущество Red-Black-Tree перед хеш таблицей

1) Оно всегда в отсортированном состоянии, даже после добавления элементов, и можно его в этом отсортированном состоянии куда-нибудь вывести, распечатать, скопировать, обработать без дополнительных затрат;

2) У хеш-таблиц среднее время поиска O(1), но худшее O(N) — при плохой хеш-функции или определенном сочетании элементов множества, в то время как у красно-черного дерева — время поиска гарантированно не больше 2 * log N.

3) Хеш-таблица позволяет искать данные лишь при равенстве ключей, в то время как дерево позволяет искать ближайшие значения и диапазоны значений по неравенствам;

4) Хеш-таблица требует вычисления хеша, что не всегда возможно или имеет смысл, например, для поиска попадания значения в диапазон;

5) Рост хеш-таблицы (изменение размера) при неблагоприятных сценариях может происходить очень медленно, в то время как скорость добавления элемента в дерево ограничена тем же O(log N).

Когда он умрет, его мозг заспиртуют в стакане
Re: В чем преимущество SortedDictionary ?
От: stele Россия www.stele.su
Дата: 07.01.11 08:11
Оценка:
А что помешало использовать для измерения интервала специально для этого предназначенный Stopwatch, а не песочные часы DateTime.Now?
... << My edition based on RSDN@Home 1.2.0 alpha 4 rev. 1481 >>
В задаче спрашивается:
Сколько вытечет портвейна из открытого бассейна?
Re[2]: В чем преимущество SortedDictionary ?
От: Lloyd Россия  
Дата: 07.01.11 08:23
Оценка: :)
Здравствуйте, stele, Вы писали:

S>А что помешало использовать для измерения интервала специально для этого предназначенный Stopwatch, а не песочные часы DateTime.Now?


Ваш пост несомненно отвечает на все вопросы, сформулированные автором.
Re[2]: В чем преимущество SortedDictionary ?
От: Аноним  
Дата: 07.01.11 08:52
Оценка: -1
Здравствуйте, stele, Вы писали:

S>А что помешало использовать для измерения интервала специально для этого предназначенный Stopwatch, а не песочные часы DateTime.Now?


Да смысл в стопвочах, лишний uses тащить еще вызовы start(); stop(); прописывать — datetime лишен этих недостатков.

var s = DateTime.Now;
...
Console.WriteLine( " ... {0}", DateTime.Now - s);


vs

uses System.Diagnosting;

var s = new Stopwatch();
s.Start();
...
s.Stop();
Console.WriteLine( " ... {0}", s.Elapsed );

к чему лишние 3 строчки
Re[3]: В чем преимущество SortedDictionary ?
От: stele Россия www.stele.su
Дата: 07.01.11 08:56
Оценка:
А ты поробуй, результат тебя порадует.
... << My edition based on RSDN@Home 1.2.0 alpha 4 rev. 1481 >>
В задаче спрашивается:
Сколько вытечет портвейна из открытого бассейна?
Re[4]: В чем преимущество SortedDictionary ?
От: Аноним  
Дата: 07.01.11 09:08
Оценка: +1
Здравствуйте, stele, Вы писали:

S>А ты поробуй, результат тебя порадует.


Попробовал .. вместо 0.9 — 0.87 ..т.е. гдето 3% разница.
Ты хотел сказать что оно точнее ? Возможно. Но в данном случае для сравнения порядков такая точность не нужна.
В любом случае спасибо что обратил внимание
Re[3]: В чем преимущество SortedDictionary ?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 07.01.11 10:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>uses System.Diagnosting;

А>var s = new Stopwatch();
А>s.Start();
А>...
А>s.Stop();
А>Console.WriteLine( " ... {0}", s.Elapsed );
А>

А> к чему лишние 3 строчки

using System.Diagnostics;

var s = Stopwatch.StartNew();
...
Console.WriteLine( " ... {0}", s.Elapsed );

Лишняя-то лишь одна получается
Re[4]: В чем преимущество SortedDictionary ?
От: hardcase Пират http://nemerle.org
Дата: 07.01.11 11:51
Оценка: +1
Здравствуйте, samius, Вы писали:

S>Лишняя-то лишь одна получается


Вообще разницы нет
var s = System.Diagnostics.Stopwatch.StartNew();
...
Console.WriteLine( " ... {0}", s.Elapsed);
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: В чем преимущество SortedDictionary ?
От: Аноним  
Дата: 07.01.11 20:57
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, samius, Вы писали:


S>>Лишняя-то лишь одна получается


H>Вообще разницы нет

H>
H>var s = System.Diagnostics.Stopwatch.StartNew();
H>...
H>Console.WriteLine( " ... {0}", s.Elapsed);
H>


Ок. Убедили !
Но меня вот последнее время заботит вопрос как от лишних строк избавится здесь : http://www.rsdn.ru/forum/dotnet/4107202.1.aspx
Автор:
Дата: 07.01.11
Re[6]: В чем преимущество SortedDictionary ?
От: _FRED_ Черногория
Дата: 07.01.11 21:17
Оценка: +1
Здравствуйте, Аноним, Вы писали:

S>>>Лишняя-то лишь одна получается


H>>Вообще разницы нет

H>>var s = System.Diagnostics.Stopwatch.StartNew();
H>>...
H>>Console.WriteLine( " ... {0}", s.Elapsed);


А>Ок. Убедили !


Не в том вы видите красоту, не в количестве строк правда. Юзинг надо отдельно описывать. И .Stop() перед .Elapsed вызывать.

А>Но меня вот последнее время заботит вопрос как от лишних строк избавится здесь : http://www.rsdn.ru/forum/dotnet/4107202.1.aspx
Автор:
Дата: 07.01.11


А за вызов .ToList() только ради того, что бы получить доступ к .ForEach() надо канделябром Индекс текущей записи в .Select нужно узнавать не посредством вшешнего счётчика, а с помощью соответствующей перегрузки
Help will always be given at Hogwarts to those who ask for it.
Re[7]: В чем преимущество SortedDictionary ?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 07.01.11 21:35
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>И .Stop() перед .Elapsed вызывать.


Это имеет смысл если
а) между точкой где нужно остановить таймер и точкой использования Elapsed выполняется некий код, который может повлиять на замер. В данном случае имхо можно пренебречь... А вот если бы строка форматирования доставалась из ресурса — тогда Stop бы не помешал.
б) Elapsed используется повторно. Тогда у неостановленного таймера показания Elapsed могут отличаться.

Т.е. в данном конкретном случае Stop можно и не вызывать
Re[6]: В чем преимущество SortedDictionary ?
От: stele Россия www.stele.su
Дата: 08.01.11 08:11
Оценка: +1
С тебя компилятор берёт оплату построчно?
... << My edition based on RSDN@Home 1.2.0 alpha 4 rev. 1481 >>
В задаче спрашивается:
Сколько вытечет портвейна из открытого бассейна?
Re[4]: В чем преимущество SortedDictionary ?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 11.01.11 17:48
Оценка: :))
Здравствуйте, Kerbadun, Вы писали:

K>2)у красно-черного дерева — время поиска гарантированно не больше 2 * log N.


Это в секундах?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.