Is the update complexity O(log N) for this persistent map implementation?

Правка en9, от ReaLNero, 2024-11-24 11:00:07

I have a really succinct implementation for a persistent map with $$$O(log N)$$$ querying and (hopefully) $$$O(log N)$$$ amortized average-case insertion. Is this correct, or is the insertion actually $$$O(log^2 N)$$$?

I know there's the pathological case where if you keep doing insertion for the version of the LinkedList where the sum of dict sizes is a power of two, then you might end up repeatedly copying the whole dictionary. Let's say that's not the average case. Besides, I think modifying len(parent.curr_dict) <= len(curr_dict) to be randomized e.g. len(parent.curr_dict) <= len(curr_dict) and random.random() < 0.5 would probably solve that.

FWIW I've heard there's an O(1) lookup/insert persistent map paper, but this approach seems deceptively simple?

Also, for anyone unfamiliar -- Python dictionaries are hashmaps, so insertion/querying is amortized $$$O(1)$$$,

class LinkedList:
  parent: LinkedList | None
  curr_dict: dict[str, int]

def update(parent: LinkedList, key: str, value: int) -> LinkedList:
  curr_dict = {key: value}
  while parent is not None and len(parent.curr_dict) <= len(curr_dict):
    curr_dict |= parent.curr_dict
    parent = parent.parent
  return LinkedList(parent=parent, curr_dict=curr_dict)

def query(node: LinkedList, key: str) -> int | None:
  while node is not None:
    if value := curr_dict.get(key)
      return value
    node = node.parent
  return None

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
en9 Английский ReaLNero 2024-11-24 11:00:07 13 Tiny change: 'ile parent.parent is not null and len(p' -> 'ile parent is not None and len(p'
en8 Английский ReaLNero 2024-11-19 02:16:53 115
en7 Английский ReaLNero 2024-11-19 02:11:55 20
en6 Английский ReaLNero 2024-11-19 02:09:03 184
en5 Английский ReaLNero 2024-11-19 01:51:23 38
en4 Английский ReaLNero 2024-11-19 01:50:51 88
en3 Английский ReaLNero 2024-11-19 01:49:59 12 Tiny change: 'erying is O(1)\n\n```pyt' -> 'erying is amortized $O(1)$\n\n```pyt'
en2 Английский ReaLNero 2024-11-19 01:49:13 291
en1 Английский ReaLNero 2024-11-19 01:46:43 863 Initial revision (published)