juan_gandhi: (Default)
Juan-Carlos Gandhi ([personal profile] juan_gandhi) wrote2012-07-02 12:24 pm
Entry tags:

наука и жизнь

Scala:
  scala> List(Set(1,2)).flatten == List(Set(2,1)).flatten
res3: Boolean = false


Бля.
(deleted comment)

[identity profile] nponeccop.livejournal.com 2012-07-03 02:53 pm (UTC)(link)
> ne, zachem ispol'zujut Data.HashSet ?

Я не знаю, я не использую.

Реализации и интерфейсы существенно различные.

HashSet требует от элементов реализации Hashable.

Set требует реализации Ord.

Думаю, что проще в реализации и быстрее исполняется в конкретном случае - то и надо использовать.

[identity profile] eacher.livejournal.com 2012-07-03 03:02 pm (UTC)(link)

>> Я не знаю, я не использую.

hurraaa!!! a to ja dumal, chto ja odin takoj :)

spasibo za raz'jasnenija

[identity profile] sassa-nf.livejournal.com 2012-07-03 06:18 pm (UTC)(link)
дык, вроде ясно зачем.

Set имеет логарифмическую (от размера сета) стоимость для insert / delete / lookup. HashSet амортизирует эту стоимость за счёт O(1) операции хеширования (дальше логарифмическая стоимость поиска по меньшему субсету).

[identity profile] nponeccop.livejournal.com 2012-07-04 04:51 am (UTC)(link)
Непонятно, насколько он амортизирует и амортизирует ли, т.к. IntMap - это не хеш-таблица, а bit trie, как я понял.

[identity profile] sassa-nf.livejournal.com 2012-07-04 07:30 am (UTC)(link)
ха, я не посмотрел.

ну, тогда вычислить хеш один раз и сравнивать хеши просто, а сравнивать сложный объект каждый раз - не просто.

[identity profile] sassa-nf.livejournal.com 2012-07-03 06:10 pm (UTC)(link)
мммм... дык, HashSet тоже требует Ord.

А можно разложить по полочкам, почему пример с HashSet выдал False? Я сегодня с утра когда глядел, мне показалось, что весь сет бьётся на субсеты с помощью хеша, а субсет-то всё равно Set. Т.е. значения с одинаковым хешем всё равно должны оказаться упорядоченными в каждом субсете. Вот и не понятно, в чём прикол тогда.

[identity profile] nponeccop.livejournal.com 2012-07-03 06:11 pm (UTC)(link)
Это не ко мне. Меня всего лишь попросили найти коллизию и проверить с ней.

[identity profile] sassa-nf.livejournal.com 2012-07-03 08:02 pm (UTC)(link)
ну да, но теперь же это самое интересное :)

import qualified Data.IntMap as I
import qualified Data.Set as S
...
insert :: (Hashable a, Ord a) => a -> HashSet a -> HashSet a
insert a (HashSet s) = HashSet $
  I.insertWith (\_ -> S.insert a) (hash a) (S.singleton a) s
по ключу (hash a) нашли существующее значение и скомбинировали его с новым: (S.insert a). Поскольку S.insert==Set.insert, то должно быть отсортировано. quickcheck что, к разным типам привёл два списка?

[identity profile] nponeccop.livejournal.com 2012-07-04 04:54 am (UTC)(link)
> quickcheck что, к разным типам привёл два списка?

Это исключено, т.к. (==) :: Eq a => a -> a -> Bool, а не (Eq a, Eq b) => a -> b -> Bool, т.е. сравнению требуется 2 одинаковых типа.

Вы на toList и fromList посмотрите. Как происходит вставка одного элемента - иррелевантно, т.к. пример её не использует.

[identity profile] sassa-nf.livejournal.com 2012-07-04 07:27 am (UTC)(link)
ну, посмотрю. я думал, дложно было быть consistent с поэлементной вставкой.

[identity profile] nponeccop.livejournal.com 2012-07-04 07:38 am (UTC)(link)
в документации порядок не гарантируется. Соответственно, и консистентность.

[identity profile] sassa-nf.livejournal.com 2012-07-04 07:39 am (UTC)(link)
говорят, используется:

fromList :: (Hashable a, Ord a) => [a] -> HashSet a
fromList xs = foldl' (flip insert) empty xs


да, я понимаю насчёт Eq, но как ещё объяснить разницу. Если бы объекты были одинаковы, то insert выполнился бы одинаково.

Мне доустановить ещё чё-то там надо. А то бы просто глянуть на fromList одного и другого.