Advertisement
Guest User

Untitled

a guest
May 14th, 2018
321
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
TCL 3.08 KB | None | 0 0
  1. package require TclOO
  2.  
  3. oo::class create Node {
  4.      variable x
  5.      variable y
  6.      variable left
  7.      variable right
  8.  
  9.      constructor {_x} {
  10.           set x $_x
  11.           set y [expr {int(rand()*2**31)}]
  12.           set left {}
  13.           set right {}
  14.      }
  15.  
  16.      method get {var} {
  17.           return [set $var]
  18.      }
  19.  
  20.      method left {val} {
  21.           set left $val
  22.      }
  23.  
  24.      method right {val} {
  25.           set right $val
  26.      }
  27. }
  28.  
  29. proc merge {lower greater} {
  30.      if {$greater eq {} || $lower eq {}} {return [concat $lower $greater]}
  31.  
  32.      if {[$lower get y] > [$greater get y]} {
  33.           $lower right [merge [$lower get right] $greater]
  34.           return $lower
  35.      } else {
  36.           $greater left [merge $lower [$greater get left]]
  37.           return $greater
  38.      }
  39. }
  40.  
  41. proc splitBinary {orig value} {
  42.      if {$orig eq {}} {
  43.           return {{} {}}
  44.      }
  45.  
  46.      if {[$orig get x] < $value} {
  47.           set splitPair [splitBinary [$orig get right] $value]
  48.           $orig right [lindex $splitPair 0]
  49.           return [list $orig [lindex $splitPair 1]]
  50.      } else {
  51.           set splitPair [splitBinary [$orig get left] $value]
  52.           $orig left [lindex $splitPair 1]
  53.           return [list $orig [lindex $splitPair 0]]
  54.      }
  55. }
  56.  
  57. proc merge3 {lower equal greater} {
  58.      return [merge [merge $lower $equal] $greater]
  59. }
  60.  
  61. oo::class create SplitResult {
  62.      variable lower
  63.      variable equal
  64.      variable greater
  65.  
  66.      constructor {args}  {
  67.           lassign $args lower equal greater
  68.      }
  69.  
  70.      method unknown {args} {
  71.           lassign $args var val
  72.           if {[llength $args] == 1} {return [set $var]}
  73.           return [set $var $val]
  74.      }
  75. }
  76.  
  77. proc tsplit {orig value} {
  78.      lassign [splitBinary $orig $value] lower equalGreater
  79.      lassign [splitBinary $equalGreater [expr {$value + 1}]] equal greater
  80.      return [SplitResult new $lower $equal $greater]
  81. }
  82.  
  83. oo::class create Tree {
  84.      variable root
  85.  
  86.      constructor {} {
  87.           set root {}
  88.      }
  89.  
  90.      method has_value {x} {
  91.           set splited [tsplit $root $x]
  92.           set res [expr {[$splited equal] ne {}}]
  93.           set root [merge3 [$splited lower] [$splited equal] [$splited greater]]
  94.           return $res
  95.      }
  96.  
  97.      method insert {x} {
  98.           set splited [tsplit $root $x]
  99.           if {[$splited equal] eq {}} {
  100.                $splited equal [Node new $x]
  101.           }
  102.           set root [merge3 [$splited lower] [$splited equal] [$splited greater]]
  103.      }
  104.  
  105.      method erase {x} {
  106.           set splited [tsplit $root $x]
  107.           set root [merge [$splited lower] [$splited greater]]
  108.      }
  109. }
  110.  
  111. set tree [Tree new]
  112. set cur 5
  113. set res 0
  114.  
  115. for {set i 1} {$i < 1000000} {incr i} {
  116.      set a [expr {$i % 3}]
  117.      set cur [expr {($cur * 57 + 43) % 10007}]
  118.      switch $a {
  119.           0 {
  120.                $tree insert $cur
  121.           }
  122.           1 {
  123.                $tree erase $cur
  124.           }
  125.           2 {
  126.                if {[$tree has_value $cur]} {
  127.                     incr res
  128.                }
  129.           }
  130.      }
  131. }
  132. puts $res
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement