亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

go : 這種情況下需要通道嗎?

go : 這種情況下需要通道嗎?

Go
開心每一天1111 2021-07-03 09:01:06
http://play.golang.org/p/Xn3Qw7xAi3很難理解渠道。我這里有func main() {  in := make(chan int)  out := make(chan int)  go QuickSort(in, out)  for i := 0; i < 100; i++ {    in <- rand.Intn(1000)  }  close(in)  for i := range out {    fmt.Println(i)  }}這使得兩個名為 in、out 和 goroutine 的通道成為 Quicksort 函數。1. QuickSort 如何將 in 和 out 作為參數?它是否從下面的行接收?  in <- rand.Intn(1000)2. 這種情況下使用通道是最優的嗎 動態接收值看起來非常整潔......沒有通道的排序會有什么不同?這種情況比較快?
查看完整描述

3 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

我的原始文章回答了你的第二個問題,我認為......

只是為了好玩 - 基于頻道的快速排序。

有趣的是,您可以在無法索引輸入的情況下進行快速排序。它可能是 O(n log n) 進行比較,但它是 O(n) 通道和 go 例程,所以可能不是有史以來最有效的快速排序;-)

如果你給它排序的輸入,它也有最壞情況的復雜度 O(n2),所以不要這樣做!

這確實有點有趣 - 但它使用了大量的通道和 goroutines,這將使它比傳統的快速排序更慢并使用更多的內存。


查看完整回答
反對 回復 2021-07-12
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

1. QuickSort 如何將 in 和 out 作為參數?它是否從下面的行接收?

此代碼將 100 個隨機推送到名為“in”的通道中。您之前將此通道的引用傳遞給了快速排序函數。這與我向函數傳遞線程安全堆棧,然后從調用者上下文中將新元素推送到該堆棧上的想法相同。

  for i := 0; i < 100; i++ {
    in <- rand.Intn(1000)
  }
  close(in)

2.這種情況下使用通道是最優的嗎?動態接收值看起來非常整潔......沒有通道的排序會有什么不同?這種情況比較快?

我會認為這是一個很酷的玩具示例,說明如何靈活地使用頻道(和流式排序)。在大多數常見情況下,獲取切片并對其調用sort.Sort通常會更快/更容易。值得注意的是,在大多數實際情況下,您將通過創建帶有緩沖區通道獲得更好的吞吐量,因為這將減少 goroutine 之間的調度程序切換。通道非???,但它們仍然有開銷,如果您實際上沒有并行處理,那么開銷不會給您帶來任何好處。

如果您想并行處理,請不要忘記設置 GOMAXPROCS > 1 并使用緩沖通道。


查看完整回答
反對 回復 2021-07-12
  • 3 回答
  • 0 關注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號