1. 程式人生 > >【資料結構】

【資料結構】

1.有了遞迴,為什麼還需要非遞迴?

嚴格來說,是因為非遞迴的效率比遞迴的效率高,但是,我們都知道,現在的編譯器很強大,優化的效果也非常好,所以非遞迴的效率並不比遞迴好多少,那麼為什麼還要使用非遞迴呢?最主要的原因是遞迴有一個非常大的缺陷:它只適合在分治的情況下使用,當你的應用場景下面遞迴深度太深時就會導致程式雖然是對的,但是跑不出結果,甚至會出現棧溢位的問題。使用非遞迴雖然也藉助棧,但是這個棧是動態開闢的,而動態開闢又是在堆區,且堆區遠大於棧,所以就不會出現棧溢位的問題。

2.請證明,環形連結串列的fast指標和slow指標,為什麼是slow指標走一步,fast指標走兩步,slow指標走一步,fast指標走三步行嗎?四步呢?

有兩種證明方法:

①反證法

假如slow指標走1步,fast指標走3步,也就是說他們兩每走一次,距離縮小2,那麼一直縮小:n-2,n-4,n-6,,......3,當縮小為1步時,如果再縮小一步,他們兩就剛好會錯開,而當環的程度剛好到達某個特殊點的時候,每次準備相遇是,就錯開,一直這樣,就會永遠錯開,舉個例子來說明:

②直接證明:

假設fast指標和slow指標相差n步,fast指標走兩步,slow指標走一步,意味著他們兩每走一次,距離縮小1,那麼一直縮小:n-1,n-2,n-3,,......2,1,最後一定會縮小到0步,也就是說最終肯定會相遇。

3.堆裡面有一個常見的top k問題:如果要找100萬個數裡面的top100,應該如何完成這一操作?

這時候,我們可以建一個100數大小的堆,因為要找前100個數,我們第一想到的是要建大堆,但是實際上建大堆只能選出其中最大的一個,假設第一個數就是最大的,剩下的所有數就進不了堆,所以我們應該建的是小堆,因為建小堆,大的數才能夠進來,那麼相反,找最小的100個數建的就是大堆了。因為建大堆,小的數才能夠進來,就能找到最小的100個數了。