Unbounded Searching Problem | Algorithms Notes



Unbounded Searching Problem | Algorithms Notes

Let A[n] be an array with n elements sorted in ascending order. It is simple to construct an O(n lg n) algorithm to find the position k in A[n] for a given value v. Assume that k is much less than n (i.e., k << n). Write an O(lg k) time algorithm to search for k.
(Note: you do not know the value of k in advance, only v is known)

Solution:

This is an application of binary search. Although we do not know k in advance, we can find the range of k. That is, find an integer i such that 2^ik < 2^{i+1}. Using linear search to find i costs O(i) = O(lg k). Then applying the binary search on the subarray A[2^i]~A[2^{i+1}-1] requires O(\lg (2^{i+1} - 2^i)) = O(i) = O(lg k) time, so the total time complexity is O(lg k).

This idea can also be generalized to higher dimension space.

解法

這是一個二分搜尋法的應用。雖然事先不知道k的大小,但是可以利用演算法找出k的範圍,也就是找一個整數i使得2^i ≤ k < 2^{i+1}。利用線性搜尋只需要花O(i) = O(lg k)的時間。接著只要在子陣列A[2^i]~A[2^{i+1}-1]中做二分搜尋即可,需要花O(\lg (2^{i+1} - 2^i)) = O(i) = O(lg k)時間,所以整體時間還是O(lg k)。


Read full article from Unbounded Searching Problem | Algorithms Notes


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts