假設有一個整數數組(例如爲[1 5 3 4 6])。元素根據以下規則重新排列。每個元素都可以向前跳躍(向左),並在跳過的索引中滑動元素。該過程以第二索引中的元素開始(即5)。它有跳過元素1的選擇,或者它可以保持在它自己的位置。如果它選擇跳躍,則元素1向下滑動到索引2.讓我們假設它選擇跳躍,然後我們的結果數組將會是[5 1 3 4 6]。元素3現在可以跳過1或2個位置並重復該過程。如果在一個位置上跳躍3次,陣列現在是[5 3 1 4 6],並且如果跳過兩個位置,現在將是[3 5 1 4 6]。給定一個源和陣列天線的最終,發現跳數在不到二次時間複雜度生成從源最終
這是很容易證明的元素的所有可能的排列是可以以這種方式。任何最終配置都可以通過一組獨特的事件來達成。
的問題是,給定一個最終陣列和源陣列,發現在來自光源的陣列天線的最終到達所需要的跳的總數。 O(N^2)實現很容易找到,但我相信這可以在O(N)或O(NlogN)中完成。另外,如果不可能比O(N2)做得更好,那麼知道這一點將是非常好的。
例如,如果最後一個數組爲[3,5,1,4,6]和源陣列[1,5,3,4,6],答案將是3.
我ö (N2)算法是這樣的:你從源頭數組的所有位置循環遍歷,因爲我們知道這是最後一個要移動的元素。這裏是6,我們檢查它在最終數組中的位置。我們計算所需跳數,並需要重新排列最終數組,以將該元素放置在源數組中的原始位置。重新排列步驟遍歷數組中的所有元素,並且該過程遍歷所有元素,因此O(N^2)。使用散列圖或地圖可以幫助搜索,但是在每個產生O(N^2)的步驟之後需要更新地圖。
P.S.我試圖用貝葉斯方式來模擬兩個排列之間的相關性,這是一個小問題。任何關於修改生成過程以使問題更簡單的想法也是有幫助的。
編輯:我發現我的答案。這正是Kendall Tau距離所做的。有一種簡單的基於合併排序的算法可以在O(NlogN)中找到它。
什麼是你的O(N^2)算法? – v78
爲什麼「答案會是3」?這裏有2跳 - 第一跳3跳,第二跳5跳。另外,我們可以假設數組中的整數是唯一的還是不是? –
@AlexanderAnikin你只能向左跳,而不能跳到右側。 3在最左邊的位置,所以它沒有任何有效的跳躍。 5跳與3交換位置,給出[5,3,1,4,6],當前跳數爲1.然後元素1向左跳兩個位置,使當前數組[1,5,3,4 ,6]。 4和6已經在他們想要的位置。所以跳數的總數是3. –