算法导论 4-2 - newdye的专栏 - 博客频道 - CSDN.NET



算法导论 4-2 - newdye的专栏 - 博客频道 - CSDN.NET

找出所缺的整数

某数组A[1..n]含有所有从0到n的整数,但其中有一个整数不再数组中。通过利用一个辅助数组B[0..n]来记录A中出现的整数,很容易在O(n)时间内找出所缺的整数。但是在这个问题中,我们却不能由一个单一的操作来访问A中的一个完整整数,因为A中的元素是以二进制表示的。我们所能用的唯一操作就是"取A[i]的第j位",这个操作所花的时间为常数。

证明:如果仅用此操作,仍能在O(n)时间内找出所缺的整数。

2 分析与解答

显然要运用递归思想,如果n为基数,那么0~n有(n+1)/2个奇数和(n+1)/2个偶数;同理当n为偶数时,有n/2+1个偶数,和n/2个奇数。

所以,假设如果A[1..n]中偶数个数不足,那么就要在A[1..n]的偶数元素中查找所缺整数,那么每次查找的数量就减半;将偶数元素左移一位得到的数组同样具有上述特性。反复应用此方法,直到两种情况:

  1. 奇数个数为0说明缺的位为1;
  2. 只剩一位时,不存在的那位就是所缺的;

这样就能得到基本递归算法,可以得到递归式T(n)=T(n/2)+D(n)+C(n);

在来看D(n)显然分解需要扫描整个A[1..n],所以D(n)=O(n);

对于C(n),算法应该不需合并,推测其时间复杂度为常数,即C(n)=O(1);

所以,若算法满足上述条件,递归式为T(n)为T(n)=T(n/2)+O(n),根据主定理可得,此递归式解为T(n)=O(n)。

证明:可以找到满足上述条件的算法。

设取A[i]的第j位操作为value(A[i],j);

因为整数在A中以二进制形式存储,那么value(A[i], 0)就代表A中元素的奇偶性;

而value(A[i], 1)就代表A中元素左移一位的奇偶性,以此类推,直至奇数个数为0或只剩1位。


Read full article from 算法导论 4-2 - newdye的专栏 - 博客频道 - CSDN.NET


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