演算法 牆上的門

2021-08-25 14:36:37 字數 630 閱讀 2303

牆上的門

你面前是一堵朝兩個方向無限延伸的牆。牆上有一扇門,但你不知道離你有多遠,也不知道門位於哪個方向。你只有走到這扇門前才能看到它。假設從當前位置走到門前要走n步(事先並不知道n的大小),請設計乙個演算法,使你最多走o(n)步就能遇到門。([par95])

解法:首先,以當前位置為原點,門距離原點有n步(n未知),而且門位於哪個方向也不知道,所以不能只朝乙個方向去找,萬一選錯方向就永遠找不到門了。只能像鐘擺一樣以原點為中心來回找。也不能每多走一步就往另乙個方向走,因為這樣找到門時已經走了2*(1+2+3+...+n)步,即n*(n+1)步,對應於o(n^2)複雜度,不滿足題目要求。

考慮 i 從0開始,先從原點出發向右走2^i步,返回原點,再向左走2^i步,再返回原點,接著向右走2^(i+1)步,返回原點,再向左走同樣的2^(i+1)步...直到在途中找到門為止。由於門到原點的距離為n步,我們能找到乙個整數k,使得2^(k-1) < n <= 2^k. 這樣在找到門之前,你最多走了4*(2^0 + 2^1 + ... + 2^(k-1)) + 3*2^k 步,即4 * (2^k - 1) + 3 * 2^k < 7 * 2^k = 14 * 2^(k - 1) < 14 * n。這樣就保證最多走o(n)步就能遇到門。

EXLIBRIS 牆上的壞人

不知道現在的小學教室裡掛著什麼,反正我能回憶起來的包括出鏡次數最多的馬恩列斯毛和他們忠誠的唯物主義戰士們,比如 雷鋒等等。如果前面的句子可能產生誤會的話,我要說明,我是懷著敬意提到雷鋒的,樸素地說,他是乙個好人,而這也正是為什麼當我在教室的牆上發現柏拉圖時非常詫異甚至產生負罪感的原因。根據當時乙個1...

Boost在C 自己的牆上打洞

boost是極有才華的程式設計師們編寫的c 庫。boost中的程式設計技巧 對c 及泛型的使用方式 以及其最終實現的效果都令人吃驚,甚至嘆為觀止。c 是強型別語言,有嚴格的型別檢查。而boost使用c 實現了弱型別的效果,著實在c 的牆上打了乙個洞。c 的強型別特徵曾被視為一種優點。至今它仍然也是優...

Boost在C 自己的牆上打洞

boost是極有才華的程式設計師們編寫的c 庫。boost中的程式設計技巧 對c 及泛型的使用方式 以及其最終實現的效果都令人吃驚,甚至嘆為觀止。c 是強型別語言,有嚴格的型別檢查。而boost使用c 實現了弱型別的效果,著實在c 的牆上打了乙個洞。c 的強型別特徵曾被視為一種優點。至今它仍然也是優...