1&&lPq[i/2]>lPq[i]{ lTemp:=lPq[i/2] lPq[i/2]=lPq[i] lPq[i]=lTemp i=i/2 } 返回lPq } func delete_min(lPq[]int)(int,[]int){ lRetVal:=lPq[1] lPq[1]=lPq[len(lPq)-1] lPq=lPq[0:len(lPq)-1] k:=1 对于;2*k lPq[j+1]{ j++ } 如果lPq[k]64{ lprinto=64 } 变量num int 对于u,num=范围lPq[0:lPrintTo]{ fmt.Printf(“%d”,num) } fmt.Println(“”); var-lMin-int 对于索引:=1;索引 P>你的C++版本是否产生相同的输出量?,go,Go" /> 1&&lPq[i/2]>lPq[i]{ lTemp:=lPq[i/2] lPq[i/2]=lPq[i] lPq[i]=lTemp i=i/2 } 返回lPq } func delete_min(lPq[]int)(int,[]int){ lRetVal:=lPq[1] lPq[1]=lPq[len(lPq)-1] lPq=lPq[0:len(lPq)-1] k:=1 对于;2*k lPq[j+1]{ j++ } 如果lPq[k]64{ lprinto=64 } 变量num int 对于u,num=范围lPq[0:lPrintTo]{ fmt.Printf(“%d”,num) } fmt.Println(“”); var-lMin-int 对于索引:=1;索引 P>你的C++版本是否产生相同的输出量?,go,Go" />

我的优先级队列测试程序是否非常慢,因为我没有正确使用Go? 我编写了这个粗略的MIN堆代码,它是我在C++中编写的一个类似程序的翻译。我认为我必须使用错误的切片,因为GO代码比C++代码慢。插入和删除100000个整数在GO中花费大约19秒,但在C++中只需1.73秒。有人能提供一些建议吗?还是比C++慢得多?我在Linux下对代码进行如下计时:“time./pqgo-n100000-d100000>/dev/null”。代码如下: package main import ( "fmt" "time" "math/rand" "flag" ) func insert( key int, lPq []int) []int { lPq = append( lPq[:], key ) i := len(lPq) - 1 for ; i > 1 && lPq[ i/2 ] > lPq[i] ; { lTemp := lPq[ i/2 ] lPq[ i/2 ] = lPq[i] lPq[i] = lTemp i = i / 2 } return lPq } func delete_min( lPq []int) (int, []int) { lRetVal := lPq[1] lPq[1] = lPq[ len(lPq)-1 ] lPq = lPq[0:len(lPq)-1 ] k := 1 for ; 2*k <= len(lPq); { j := 2*k if k < len(lPq) && lPq[j] > lPq[j+1] { j++ } if lPq[k] <= lPq[j] { break } lTemp := lPq[k] lPq[k] = lPq[j] lPq[j] = lTemp } return lRetVal, lPq } func main() { var lPq []int lPq = append(lPq[:], -9999) var ip *int = flag.Int("n", 8, "help message") var ip2 *int = flag.Int("d", 8, "help message2") flag.Parse() lNum := *ip fmt.Printf( "lNum= %d\n", lNum) lPq = insert( 17, lPq[:] ); lPq = insert( 19, lPq[:] ); lPq = insert( 9, lPq[:] ); lPq = insert( 4 , lPq[:]); lPq = insert ( 12, lPq[:] ); rand.Seed(time.Now().UnixNano()) for i := 0; i < lNum; i++ { lKey := rand.Intn( 4*lNum ) lPq = insert(lKey, lPq[:]) } fmt.Printf("pq.size = %d\n", len(lPq) ) lPrintTo := len(lPq) if lPrintTo > 64 { lPrintTo = 64 } var num int for _, num = range lPq[0:lPrintTo] { fmt.Printf( "%d ", num) } fmt.Println(""); var lMin int for index := 1; index < 3; index++ { lMin, lPq = delete_min( lPq[:] ) fmt.Printf( "lMin = %d\n", lMin) for _, num = range lPq[0:lPrintTo] { fmt.Printf( "%d ", num) } fmt.Println(""); } lPq = insert( 3, lPq[:] ); lPq = insert( 4, lPq[:] ); lPq = insert( 1, lPq[:] ); lPq = insert( 8, lPq[:] ); lPq = insert( 20, lPq[:] ); lPq = insert( 21, lPq[:] ); lPq = insert( 6, lPq[:] ); lPq = insert ( 11, lPq[:] ); lNumToDelete := len( lPq ) lNumToDelete = *ip2 for index := 1; index < lNumToDelete-1; index++ { lMin, lPq = delete_min( lPq[:] ) lPrintTo = len(lPq) if lPrintTo > 64 { lPrintTo = 64 } fmt.Printf("lPrintTo = %d\n",lPrintTo ) fmt.Printf("pq.size = %d\n", len(lPq) ) for _, num = range lPq[0:lPrintTo] { fmt.Printf( "%d ", num) } fmt.Println(""); } } // gccgo -Og -I/devserv-home/rspikol/include -o pqgo pq.go -L/devserv-home/rspikol/lib 主程序包 进口( “fmt” “时间” “数学/兰德” “旗帜” ) func insert(键int,lPq[]int)[]int{ lPq=append(lPq[:],键) i:=len(lPq)-1 对于;i>1&&lPq[i/2]>lPq[i]{ lTemp:=lPq[i/2] lPq[i/2]=lPq[i] lPq[i]=lTemp i=i/2 } 返回lPq } func delete_min(lPq[]int)(int,[]int){ lRetVal:=lPq[1] lPq[1]=lPq[len(lPq)-1] lPq=lPq[0:len(lPq)-1] k:=1 对于;2*k lPq[j+1]{ j++ } 如果lPq[k]64{ lprinto=64 } 变量num int 对于u,num=范围lPq[0:lPrintTo]{ fmt.Printf(“%d”,num) } fmt.Println(“”); var-lMin-int 对于索引:=1;索引 P>你的C++版本是否产生相同的输出量?

我的优先级队列测试程序是否非常慢,因为我没有正确使用Go? 我编写了这个粗略的MIN堆代码,它是我在C++中编写的一个类似程序的翻译。我认为我必须使用错误的切片,因为GO代码比C++代码慢。插入和删除100000个整数在GO中花费大约19秒,但在C++中只需1.73秒。有人能提供一些建议吗?还是比C++慢得多?我在Linux下对代码进行如下计时:“time./pqgo-n100000-d100000>/dev/null”。代码如下: package main import ( "fmt" "time" "math/rand" "flag" ) func insert( key int, lPq []int) []int { lPq = append( lPq[:], key ) i := len(lPq) - 1 for ; i > 1 && lPq[ i/2 ] > lPq[i] ; { lTemp := lPq[ i/2 ] lPq[ i/2 ] = lPq[i] lPq[i] = lTemp i = i / 2 } return lPq } func delete_min( lPq []int) (int, []int) { lRetVal := lPq[1] lPq[1] = lPq[ len(lPq)-1 ] lPq = lPq[0:len(lPq)-1 ] k := 1 for ; 2*k <= len(lPq); { j := 2*k if k < len(lPq) && lPq[j] > lPq[j+1] { j++ } if lPq[k] <= lPq[j] { break } lTemp := lPq[k] lPq[k] = lPq[j] lPq[j] = lTemp } return lRetVal, lPq } func main() { var lPq []int lPq = append(lPq[:], -9999) var ip *int = flag.Int("n", 8, "help message") var ip2 *int = flag.Int("d", 8, "help message2") flag.Parse() lNum := *ip fmt.Printf( "lNum= %d\n", lNum) lPq = insert( 17, lPq[:] ); lPq = insert( 19, lPq[:] ); lPq = insert( 9, lPq[:] ); lPq = insert( 4 , lPq[:]); lPq = insert ( 12, lPq[:] ); rand.Seed(time.Now().UnixNano()) for i := 0; i < lNum; i++ { lKey := rand.Intn( 4*lNum ) lPq = insert(lKey, lPq[:]) } fmt.Printf("pq.size = %d\n", len(lPq) ) lPrintTo := len(lPq) if lPrintTo > 64 { lPrintTo = 64 } var num int for _, num = range lPq[0:lPrintTo] { fmt.Printf( "%d ", num) } fmt.Println(""); var lMin int for index := 1; index < 3; index++ { lMin, lPq = delete_min( lPq[:] ) fmt.Printf( "lMin = %d\n", lMin) for _, num = range lPq[0:lPrintTo] { fmt.Printf( "%d ", num) } fmt.Println(""); } lPq = insert( 3, lPq[:] ); lPq = insert( 4, lPq[:] ); lPq = insert( 1, lPq[:] ); lPq = insert( 8, lPq[:] ); lPq = insert( 20, lPq[:] ); lPq = insert( 21, lPq[:] ); lPq = insert( 6, lPq[:] ); lPq = insert ( 11, lPq[:] ); lNumToDelete := len( lPq ) lNumToDelete = *ip2 for index := 1; index < lNumToDelete-1; index++ { lMin, lPq = delete_min( lPq[:] ) lPrintTo = len(lPq) if lPrintTo > 64 { lPrintTo = 64 } fmt.Printf("lPrintTo = %d\n",lPrintTo ) fmt.Printf("pq.size = %d\n", len(lPq) ) for _, num = range lPq[0:lPrintTo] { fmt.Printf( "%d ", num) } fmt.Println(""); } } // gccgo -Og -I/devserv-home/rspikol/include -o pqgo pq.go -L/devserv-home/rspikol/lib 主程序包 进口( “fmt” “时间” “数学/兰德” “旗帜” ) func insert(键int,lPq[]int)[]int{ lPq=append(lPq[:],键) i:=len(lPq)-1 对于;i>1&&lPq[i/2]>lPq[i]{ lTemp:=lPq[i/2] lPq[i/2]=lPq[i] lPq[i]=lTemp i=i/2 } 返回lPq } func delete_min(lPq[]int)(int,[]int){ lRetVal:=lPq[1] lPq[1]=lPq[len(lPq)-1] lPq=lPq[0:len(lPq)-1] k:=1 对于;2*k lPq[j+1]{ j++ } 如果lPq[k]64{ lprinto=64 } 变量num int 对于u,num=范围lPq[0:lPrintTo]{ fmt.Printf(“%d”,num) } fmt.Println(“”); var-lMin-int 对于索引:=1;索引 P>你的C++版本是否产生相同的输出量?,go,Go,最后一个循环运行lNumToDelete(100000)次,并在每次迭代时从队列中打印多达64个值。这是大量的输出,格式化和写出也需要时间,即使它将/dev/null 注释掉delete循环中的fmt.Printf()调用使程序运行速度大大加快 其他一些建议: fmt.Printf(“a=%d\n”,b)可以替换为fmt.Println(“a=,b) lPq[:]可以替换为lPq 查看Go分析工具: 是否你的C++版本产生相同的输出量? 最后一个循环运行lNumToDelete(100000

最后一个循环运行
lNumToDelete
(100000)次,并在每次迭代时从队列中打印多达64个值。这是大量的输出,格式化和写出也需要时间,即使它将
/dev/null

注释掉delete循环中的
fmt.Printf()
调用使程序运行速度大大加快

其他一些建议:

  • fmt.Printf(“a=%d\n”,b)
    可以替换为
    fmt.Println(“a=,b)
  • lPq[:]
    可以替换为
    lPq
  • 查看Go分析工具:

是否你的C++版本产生相同的输出量? 最后一个循环运行

lNumToDelete
(100000)次,并在每次迭代时从队列中打印多达64个值。这是大量的输出,格式化和写出也需要时间,即使它将
/dev/null

注释掉delete循环中的
fmt.Printf()
调用使程序运行速度大大加快

其他一些建议:

  • fmt.Printf(“a=%d\n”,b)
    可以替换为
    fmt.Println(“a=,b)
  • lPq[:]
    可以替换为
    lPq
  • 查看Go分析工具:

还想知道兰德公司的速度是否是其中的一部分,因为我怀疑Go的RNG是否是超优化的。如果分析显示是这样的话,如果您想解决这个问题,您可以用一个愚蠢的存根来替换它,它生成的数字不是很伪随机,但仍然是均匀分布的(
r=(r^const1)*(const2|1);r^=r>>const3;
或其他什么)。谢谢!我错过了delete循环中的fmt.Printf()。是的,即使I/O被重定向,它也绝对是一个时间接收器!还想知道兰德的速度是否是其中的一部分,因为我怀疑Go的RNG是否是超优化的。如果分析显示是这样的话,如果您想解决这个问题,您可以用一个愚蠢的存根来替换它,它生成的数字不是很伪随机,但仍然是均匀分布的(
r=(r^const1)*(const2|1);r^=r>>const3;
或其他什么)。谢谢!我错过了delete循环中的fmt.Printf()。是的,即使I/O被重定向,它也绝对是一个时间接收器!旁白。如果您可以根据Go标准缩进代码,那就太好了。您不必手动执行此操作,工具“gofmt”将为您执行此操作,或者,您可以使用游乐场的“格式”按钮。这将使您的代码更容易阅读的人习惯于编写和阅读围棋代码。谢谢旁白。如果您可以根据Go标准缩进代码,那就太好了。您不必手动执行此操作,工具“gofmt”将为您执行此操作,或者,您可以使用游乐场的“格式”按钮。这将使您的代码更容易阅读的人习惯于编写和阅读围棋代码。谢谢