3 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
我的原始文章回答了你的第二個(gè)問題,我認(rèn)為......
只是為了好玩 - 基于頻道的快速排序。
有趣的是,您可以在無(wú)法索引輸入的情況下進(jìn)行快速排序。它可能是 O(n log n) 進(jìn)行比較,但它是 O(n) 通道和 go 例程,所以可能不是有史以來(lái)最有效的快速排序;-)
如果你給它排序的輸入,它也有最壞情況的復(fù)雜度 O(n2),所以不要這樣做!
這確實(shí)有點(diǎn)有趣 - 但它使用了大量的通道和 goroutines,這將使它比傳統(tǒng)的快速排序更慢并使用更多的內(nèi)存。

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個(gè)贊
1. QuickSort 如何將 in 和 out 作為參數(shù)?它是否從下面的行接收?
此代碼將 100 個(gè)隨機(jī)推送到名為“in”的通道中。您之前將此通道的引用傳遞給了快速排序函數(shù)。這與我向函數(shù)傳遞線程安全堆棧,然后從調(diào)用者上下文中將新元素推送到該堆棧上的想法相同。
for i := 0; i < 100; i++ { in <- rand.Intn(1000) } close(in)
2.這種情況下使用通道是最優(yōu)的嗎?動(dòng)態(tài)接收值看起來(lái)非常整潔......沒有通道的排序會(huì)有什么不同?這種情況比較快?
我會(huì)認(rèn)為這是一個(gè)很酷的玩具示例,說(shuō)明如何靈活地使用頻道(和流式排序)。在大多數(shù)常見情況下,獲取切片并對(duì)其調(diào)用sort.Sort通常會(huì)更快/更容易。值得注意的是,在大多數(shù)實(shí)際情況下,您將通過(guò)創(chuàng)建帶有緩沖區(qū)的通道獲得更好的吞吐量,因?yàn)檫@將減少 goroutine 之間的調(diào)度程序切換。通道非??欤鼈?nèi)匀挥虚_銷,如果您實(shí)際上沒有并行處理,那么開銷不會(huì)給您帶來(lái)任何好處。
如果您想并行處理,請(qǐng)不要忘記設(shè)置 GOMAXPROCS > 1 并使用緩沖通道。
- 3 回答
- 0 關(guān)注
- 224 瀏覽
添加回答
舉報(bào)