Is the update complexity O(log N) for this persistent map implementation?
Difference between en1 and en2, changed 291 character(s)
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 for cases where the sum of dict sizes is a power of two and you end up copying the whole dictionary, but let's say that's not the average case
.↵

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


```python3↵
class LinkedList:↵
  parent: LinkedList | None↵
  curr_dict: dict[str, 
objecint]↵

def update(parent: LinkedList, key: str, value: 
objecint) -> LinkedList:↵
  curr_dict = {key: value}↵
  while parent.parent is not null 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↵
```

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en9 English 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 English ReaLNero 2024-11-19 02:16:53 115
en7 English ReaLNero 2024-11-19 02:11:55 20
en6 English ReaLNero 2024-11-19 02:09:03 184
en5 English ReaLNero 2024-11-19 01:51:23 38
en4 English ReaLNero 2024-11-19 01:50:51 88
en3 English 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 English ReaLNero 2024-11-19 01:49:13 291
en1 English ReaLNero 2024-11-19 01:46:43 863 Initial revision (published)