Changeset 2138
- Timestamp:
- 06/30/08 07:23:48 (4 months ago)
- Files:
-
- trunk/Library/incomplete/SkipTree.fss (modified) (8 diffs)
- trunk/Library/incomplete/SkipTreeTest.fss (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/Library/incomplete/SkipTree.fss
r2137 r2138 65 65 insert(newkey : Key, newvalue : Value) : SkipTree[\Key,Value\] = do 66 66 newheight = randomLevel() 67 typecase exists = root.find(newkey) of68 Just[\Value\] => self69 else =>70 root' = root.insert(newkey,newvalue,newheight)71 NonEmptySkipTree[\Key,Value\](root')67 if root.find(newkey).isEmpty() then 68 root' = root.insert(newkey,newvalue,newheight) 69 NonEmptySkipTree[\Key,Value\](root') 70 else 71 self 72 72 end 73 73 end … … 148 148 private insertBelowHeight(newkey:Key, newvalue:Value, newheight:ZZ32) : Node[\Key,Value\] = do 149 149 i = insertionPoint(binarySearch[\Key\](keys,newkey)) 150 newchild = typecase child = children[i] of 150 newchild = typecase child = children[i] of 151 151 Just[\Node[\Key,Value\]\] => child.get().insert(newkey,newvalue,newheight) 152 152 else => LeafNode[\Key,Value\](newkey,newvalue,newheight) 153 153 end 154 newchildren = children[0 # i] .addRight(Just[\Node[\Key,Value\]\](newchild))|| children[(i + 1):]154 newchildren = children[0 # i] || <| newchild |> || children[(i + 1):] 155 155 Node[\Key,Value\](keys,values,newchildren,height) 156 156 end … … 159 159 private insertEqualHeight(newkey:Key, newvalue:Value) : Node[\Key,Value\] = do 160 160 i = insertionPoint(binarySearch[\Key\](keys,newkey)) 161 newkeys = keys[0#i] || singleton[\Key\](newkey)|| keys[i:]162 newvalues = values[0#i] || singleton[\Value\](newvalue)|| values[i:]161 newkeys = keys[0#i] || <| newkey |> || keys[i:] 162 newvalues = values[0#i] || <| newvalue |> || values[i:] 163 163 (newleft, newright) = 164 164 (filterChild(newkey, children[i], true), 165 165 filterChild(newkey, children[i], false)) 166 leftchildren = children[0#i] .addRight(newleft)167 rightchildren = children[(i + 1):].addLeft(newright)166 leftchildren = children[0#i] || <|[\Maybe[\Node[\Key,Value\]\]\] newleft |> 167 rightchildren = <|[\Maybe[\Node[\Key,Value\]\]\] newright |> || children[(i + 1):] 168 168 newchildren = leftchildren || rightchildren 169 169 Node[\Key,Value\](newkeys,newvalues,newchildren,height) … … 176 176 (newleft,newright) = (filterChild(newkey, Just[\Node[\Key,Value\]\](self), true), 177 177 filterChild(newkey, Just[\Node[\Key,Value\]\](self), false)) 178 newchildren = emptyList[\Maybe[\Node[\Key,Value\]\]\]().addRight(newleft).addRight(newright)178 newchildren = <| newleft, newright |> 179 179 Node[\Key,Value\](newkeys,newvalues,newchildren,newheight) 180 180 end … … 219 219 newkeys = keys[0 # insertIndex] 220 220 newvalues = values[0 # insertIndex] 221 newchildren = children[0 # insertIndex] .addRight(filteredChild)221 newchildren = children[0 # insertIndex] || <| filteredChild |> 222 222 Just[\Node[\Key,Value\]\](Node[\Key,Value\](newkeys,newvalues,newchildren,height)) 223 223 end … … 232 232 newkeys = keys[insertIndex:] 233 233 newvalues = values[insertIndex:] 234 newchildren = children[(insertIndex + 1):].addLeft(filteredChild)234 newchildren = <|[\Maybe[\Node[\Key,Value\]\]\] filteredChild |> || children[(insertIndex + 1):] 235 235 Just[\Node[\Key,Value\]\](Node[\Key,Value\](newkeys,newvalues,newchildren,height)) 236 236 end … … 309 309 310 310 LeafNode[\Key,Value\](key : Key, val : Value, height : ZZ32) = do 311 keys = singleton[\Key\](key)312 values = singleton[\Value\](val)313 child = singleton[\Maybe[\Node[\Key,Value\]\]\](Nothing[\Node[\Key,Value\]\])314 children = child .append(child)311 keys = <| key |> 312 values = <| val |> 313 child = <|[\Maybe[\Node[\Key,Value\]\]\] Nothing[\Node[\Key,Value\]\] |> 314 children = child || child 315 315 Node[\Key,Value\](keys,values,children,height) 316 316 end (** LeafNode[\Key,Value\](key : Key, val : Value, height : ZZ32) **) … … 347 347 if list[i] = key then 348 348 index := i 349 exit loop349 exit 350 350 elif list[i] > key then 351 351 index := -i - 1 352 exit loop352 exit 353 353 end 354 354 end trunk/Library/incomplete/SkipTreeTest.fss
r2137 r2138 27 27 println leaf.find(3) 28 28 println leaf.find(7) 29 testList = emptyList[\ZZ32\]().addRight(5).addRight(10).addRight(15).addRight(20)29 testList = <| 5, 10, 15, 20 |> 30 30 assert(binarySearch[\ZZ32\](testList, 2), -1) 31 31 assert(binarySearch[\ZZ32\](testList, 5), 0)
