whatcanGOwrong
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
/* The Computer Language Benchmarks Game
|
||||
* http://benchmarksgame.alioth.debian.org/
|
||||
*
|
||||
* based on Go program by The Go Authors.
|
||||
* based on C program by Kevin Carson
|
||||
* flag.Arg hack by Isaac Gouy
|
||||
* modified by Jamil Djadala to use goroutines
|
||||
* modified by Chai Shushan
|
||||
*
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var minDepth = 4
|
||||
var n = 20
|
||||
|
||||
func main() {
|
||||
runtime.GOMAXPROCS(runtime.NumCPU() * 2)
|
||||
|
||||
flag.Parse()
|
||||
if flag.NArg() > 0 {
|
||||
n, _ = strconv.Atoi(flag.Arg(0))
|
||||
}
|
||||
|
||||
maxDepth := n
|
||||
if minDepth+2 > n {
|
||||
maxDepth = minDepth + 2
|
||||
}
|
||||
stretchDepth := maxDepth + 1
|
||||
|
||||
check_l := bottomUpTree(0, stretchDepth).ItemCheck()
|
||||
fmt.Printf("stretch tree of depth %d\t check: %d\n", stretchDepth, check_l)
|
||||
|
||||
longLivedTree := bottomUpTree(0, maxDepth)
|
||||
|
||||
result_trees := make([]int, maxDepth+1)
|
||||
result_check := make([]int, maxDepth+1)
|
||||
|
||||
var wg sync.WaitGroup
|
||||
for depth_l := minDepth; depth_l <= maxDepth; depth_l += 2 {
|
||||
wg.Add(1)
|
||||
go func(depth int) {
|
||||
iterations := 1 << uint(maxDepth-depth+minDepth)
|
||||
check := 0
|
||||
|
||||
for i := 1; i <= iterations; i++ {
|
||||
check += bottomUpTree(i, depth).ItemCheck()
|
||||
check += bottomUpTree(-i, depth).ItemCheck()
|
||||
}
|
||||
result_trees[depth] = iterations * 2
|
||||
result_check[depth] = check
|
||||
|
||||
wg.Done()
|
||||
}(depth_l)
|
||||
}
|
||||
wg.Wait()
|
||||
|
||||
for depth := minDepth; depth <= maxDepth; depth += 2 {
|
||||
fmt.Printf("%d\t trees of depth %d\t check: %d\n",
|
||||
result_trees[depth], depth, result_check[depth],
|
||||
)
|
||||
}
|
||||
fmt.Printf("long lived tree of depth %d\t check: %d\n",
|
||||
maxDepth, longLivedTree.ItemCheck(),
|
||||
)
|
||||
}
|
||||
|
||||
func bottomUpTree(item, depth int) *Node {
|
||||
if depth <= 0 {
|
||||
return &Node{item, nil, nil}
|
||||
}
|
||||
return &Node{item,
|
||||
bottomUpTree(2*item-1, depth-1),
|
||||
bottomUpTree(2*item, depth-1),
|
||||
}
|
||||
}
|
||||
|
||||
type Node struct {
|
||||
item int
|
||||
left, right *Node
|
||||
}
|
||||
|
||||
func (self *Node) ItemCheck() int {
|
||||
if self.left == nil {
|
||||
return self.item
|
||||
}
|
||||
return self.item + self.left.ItemCheck() - self.right.ItemCheck()
|
||||
}
|
||||
Reference in New Issue
Block a user