Widest Inversion | Algorithms Notes



Widest Inversion | Algorithms Notes

Given an array A of n integers, find the maximum of RL where A[L] > A[R] in time O(n).

Solution:

For an index i, if there exists k < i but A[k] > A[i], then i cannot be the candidate of L. Similarly, for an index j, if there exists k > j but A[k] < A[j], then j cannot be the candidate of R. By using these two properties, we can construct two candidate sets for L and R, where L = { i : A[i] is the maximum in A[1..i] } and R = { j : A[j] is the minimum in A[j..n] }. Note that if we list the elements in A correspond to the indices in L or R, the elements are increasing in the index. For each i in L, we want to find the best partner P(i) in R, such that A[i] > A[P(j)] and P(j) – i is maximized. P(i) is the maximum j in R with A[j] < A[i]. Since P(i) is increasing in i, all partners can be found in linear time.

解法

對一索引i而言,如果存在k < iA[k] > A[i],那i就不可能會是L的候選。同理,對一索引j而言如果存在有k > jA[k] < A[j],那j就不可能是R的候選。利用此性質,我們可以建構兩個候選集合,L = {i : A[i]是A[1..i]中最大值}以及R = {j : A[j]是A[j..n]中最小值}。如果我們把LR當做索引集合,列出A中相應的元素,這些元素會是按照索引值遞增的。 對於每一個在L中的索引i,我們想要找出其在R中最佳夥伴P(i)使得A[i] > A[P(j)]且P(j) – i最大化。P(i)即為R中最大的j使得A[j] < A[i]。因為P(i)是對於i遞增的,所有P(i)的值可在線性時間內找到。

David Ginat, "Algorithmic Problem Solving and Novel Associations," Olympiads in Informatics 5 (2011), 3-11


Read full article from Widest Inversion | 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