avva: (Default)
[personal profile] avva
Я раскрываю все скрытые комментарии с правильными решениями к позавчерашней задачке. Если хотите все еще решать ее самостоятельно, не заглядывайте в комментарии. Спасибо всем, кто решал. Первый, кто нашел оптимальное решение за O(N) времени и O(1) памяти - [livejournal.com profile] ilyaraz.

Вот еще одна программистская задачка. Я когда-то знал ее решение и забыл, недавно с удовольствием решил снова. Эта задачка довольно хорошо известна, и в частности часто преподается на курсах продвинутых структур данных, и упоминается в учебниках. Так что многие наверняка ее знают - если вы знаете решение, то не пишите в комментариях. Для тех, кто не знает, это отличное упражнение для ума, по-моему.

Задача: требуется воплотить массив с дефолтным значением для всех элементов, т.е. структуру данных с тремя операциями: get(i), set(i, value) и setdefault(value). Любой вызов get() с индексом, который до сих пор ни разу не передавался set(), должен возвращать последнее выставленное дефолтное значение (или 0, если такого не было). Сложность в том, что все три операции: get, set и setdefault, должны занимать O(1) времени. При этом нельзя рассчитывать на то, что отведенная нам память имеет какой-либо специальный вид, например, заполнена нулями. Любая используемая память изначально содержит случайные байты, которые мы никак не можем контролировать.

Date: 2011-01-07 03:25 pm (UTC)
From: [identity profile] avva.livejournal.com
Попросту говоря, вызов malloc() занимает О(1) времени, но возвращает память, содержимое которой совершенно неизвестно. Так понятнее?

Вы можете предположить, простоты ради, что максимальный размер массива известен заранее, и подготовить под него вашу структуру данных, но все эти подготовки должны занимать O(1) времени, а не O(n). Т.е. можно например заранее выделить нужную память с помощью malloc(), но нельзя обнулить ее всю в цикле, или что-то еще во все ее ячейки записать.

Date: 2011-01-07 03:29 pm (UTC)
alexeybobkov: (Default)
From: [personal profile] alexeybobkov
Да, теперь понятно, спасибо. Подумаю.

Date: 2011-01-07 03:35 pm (UTC)
From: [identity profile] zhengxi.livejournal.com
set записывает в такую ячейку пару (value, sha256(value))

get возвращает
entry[1]==sha256(entry[0]) ? entry[0] : default

Date: 2011-01-07 03:41 pm (UTC)
From: [identity profile] dmage-ru.livejournal.com
Теоретически мусор может оказаться именно вида (мусор, sha256(мусор)) :)

Date: 2011-01-07 07:34 pm (UTC)
From: (Anonymous)
Даже практически может. Память, которую нам система выделяет, мы же в систему и положили. Вот там и осталось (value, sha256(value)) с прошлого раза.

Date: 2011-01-07 07:57 pm (UTC)
From: [identity profile] zhengxi.livejournal.com
Эта проблема решается счётчиком generations, увеличивающимся при каждом malloc'е такой структуры и как-то участвующем в подсчёте sha: вместо sha(value) будет или sha(concat(generation, value)) или sha(value)^generation

Date: 2011-01-07 08:20 pm (UTC)
From: (Anonymous)
Это тоже не поможет. Мало ли откуда можно получить такую пару. Может по сети прийти.

Длинное случайное число решило бы проблему, но алгоритмически случайное число получить невозможно ;)

Date: 2011-01-08 09:50 am (UTC)
From: (Anonymous)
кстати, с длинным случайным числом не нужно и sha, достаточно использовать в качестве подписи само это число ;)

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 28th, 2025 11:16 pm
Powered by Dreamwidth Studios