簡體   English   中英

鑒於0 < k < n,並且在java中的O(k log n)時間,如何在大小為n的排序數組中獲得超過n / k次的任何integer?

[英]how to get any integer in a sorted array of size n that appear more than n/k times, given that 0 < k < n, and in O(k log n) time in java?

我們需要在 java 中出現超過n/k的排序數組中找到任何 integer,如果不返回 -1。 klogn復雜性中如何實現。

假設您的輸入中有 100,000 個項目,我們選擇k = 10 ,例如,n/k 是 10,000,例如,您正在尋找相同的數字在列表中出現 10,000 次。

鑒於列表已排序,如果一個數字在其中有 10k 次,它將是連續的(彼此相鄰)。

在此基礎上,您只需要查看list[0]list[10000]並檢查兩個索引中是否有相同的數字。 如果是,那么您很容易得到答案。 如果不是,請檢查list[20000]並檢查它是否與我們剛剛在list[10000]處讀取的相同。 如果是,那太好了,我們有一個答案。 如果不是,則取list[20000]中的內容並使用它與list[30000]進行檢查,依此類推,直到結束。

你只需要k步,所以這個算法是O(k) 但它有一個小問題——你可能“不走運”而錯過了一個有效的答案。 想象一下,這個列表中確實有一個數字(比如說18 )出現了 10,005 次,但是,這 10005 次出現的索引是[9000, 19005] 我們的算法檢查索引 0、10000 和 20000,只在 10000 處找到這個數字,因此會錯誤地報告“未找到數字”。

它有多“糟糕”? 只有“一半” - 如果算法改為檢查兩次(所以不是索引 0、10k、20k、30k 等,而是索引 0、5000、10000、15000、20000、25000 等),那么它是不可能的錯過',從某種意義上說,任何有效的答案都會導致至少2 次查找具有相同的數字。 在這個例子中, lookup[10000]lookup[15000]都給你 18 - 無論你多么不幸,你都不能再“錯過它”。 但是,如果您現在找到一個“命中”(2 個連續檢查的索引具有相同的數字),您不確定。 如果list[10000]是 18 並且list[15000]也是 18,但list[20000]不是,是否匹配? 可能 - 取決於。

我們現在改變了問題:不再是“給我任何在列表中出現至少 10000 次的數字”,而是現在:“18 在這個列表中至少出現 10000 次嗎?”。

該算法要容易得多 只需使用二進制搜索查找開始和結束索引並減去它們,您就知道“運行”有多長時間。 二分搜索是一種O(log n)算法。

這會將O(log n)算法嵌入O(k)算法中,從而根據要求為您提供O(k log n)的算法復雜度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM