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:18 pm (UTC)
alexeybobkov: (Default)
From: [personal profile] alexeybobkov
Что-то я не понимаю условия задачи. Что значит "отведённая нам память"? Она что, ограничена? Если да, что значит ли это, что размер массива фиксирован? Если нет, то как работают аллокаторы, за какое время? Какие вообще условия на использование памяти? Ничего не понимаю...

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

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 05:31 am
Powered by Dreamwidth Studios