Hide

Problem H
Beständig array

En beständig datastruktur (persistent data structure) är en datastruktur som inte skriver över sig själv (muteras) när man gör en förändring i den. Det betyder att man alltid kan gå tillbaka till en tidigare version av datastrukturen.

En array är en indexerad datastruktur där det går snabbt att slå upp och ändra vilket element som helst. I denna uppgift har arrayen dynamisk storlek och kan vara gles, dvs inte alla möjliga element har tilldelats något värde.

Uppgift

Implementera en beständig datastruktur för en dynamisk array (indexerad med naturliga tal) med heltal som har följande operationer:

newarray()

Returnera en ny array.

set(a, i, value)

Sätt a[i] till value och returnera den nya versionen av arrayen. i är ett ickenegativt heltal och value är ett heltal. Såväl i som value är 32-bitstal, dvs högst $2^{31} - 1$.

get(a, i)

Returnera värdet a[i]. Om a[i] inte har tilldelats ett värde tidigare returneras 0.

En beskrivning av hur datastrukturen ska byggas finns på
https://conjoin-it.se/#clojure/persistent-data-structures.

Skriv sedan ett styrprogram som skapar en beständig array och sedan utför ovanstående operationer på den utifrån följande kommandon som läses från standard input:

get i

Skriv ut värdet på index i på standard output på en egen rad. Om inget värde tilldelats ska 0 skrivas ut. Det ska vara ett mellanslag mellan get och indexet.

set i value

Sätt värdet på index i till value. Det ska vara ett mellanslag mellan set och i och mellan i och value.

unset

Backa tillbaka till läget en set-operation tidigare. Om ingen set-operation gjorts händer inget.

Sample Input 1 Sample Output 1
set 3 17
set 3 4711
get 3
set 3 1000
unset
get 3
unset
get 3
4711
4711
17
Sample Input 2 Sample Output 2
set 0 10
set 1 11
set 2 12
set 4 14
set 6 16
set 8 18
set 7 17
set 5 15
set 3 13
get 1
get 5
unset
unset
get 3
get 5
get 7
11
15
0
0
17
Sample Input 3 Sample Output 3
set 999999 1000
get 1000000
get 999999
unset
get 999999
unset
get 999999
0
1000
0
0

Please log in to submit a solution to this problem

Log in