磁带文件存放优化 - 编程之美4.5


http://www.cnblogs.com/wuyuegb2312/p/3182896.html
要定义磁带上第n个文件,须要依次经过前面n-1个文件。假设磁带上有n个文件,长度分别为L[0],L[1], ..., L[n-1]且被访问的概率分别为P[0],P[1],...,P[n-1],请问怎样安排它们在磁带上的存储顺序最好?
分析:
  最好的安排方式应该对应期望最小的方式。思考一下,不难写出期望的表达式: 
(注意,访问第i个文件,因为要完整地读入这个文件,经过的长度是L[0]+L[1]+...+L[i]。
《编程之美》先探讨了两种简单情况:
P[0]=P[1]=...=P[n-1],即概率相等时,把最长的文件放前面、最短的文件放后面L[0]>=L[1]>=...>=L[n-1]时,期望最小;
L[0]=L[1]=...=L[n-1],即长度相等时,按概率大小从大到小排列,期望最小。
  概率和长度都不同时怎么办呢?《编程之美》提出了一个折中方案,并举了L[0]=10,L[1]=6,P[0]=0.4,P[1]=0.6的例子来验证:
按照P/L由大到小排列构造序列。
  P/L?嗯,确实综合考虑P和L两个因素了。其实有很多数学模型不都是这样嘛,将正相关的做分子,负相关的做分母。但这里是求解,而不是建模啊
在我们上文提到的贪心解也即按照P/L由大到小排列的序列中,我们考察其中i到j这一段,并采取把最末的j插入到i前面,i到j-1整体后移,即下图所示:
  可以写出后者减去前者的期望变化量为:ΔE=L[j](P[i]+...+P[j-1]) - (L[i]+...+L[j-1])P[j]。由于P[j]/L[j]<=P[j-1]/L[j-1]<=...<=P[i]/L[i],每个对应项相减都非负,其和ΔE也非负。我总结了一个规律:
  更一般地,对于任意序列,如果其中存在一个子序列i...j且P[j]/L[j]最小,经过这样的调整,新序列对应的期望E总是不减的,而且当P/L不全相等时,新期望值总会增加。反之,如果做相反的操作,把P/L大的调整到前面,那么在没有相等的情况下,新序列的的期望总会减少,直到最后不能再调整,也即P/L从大到小排列时,期望E最大。
    根据这个规律,就说明了为什么“按照P/L由大到小排列构造序列”获得的是最优解了。
  太抽象、不好理解?No problem,拿一个例子来说明。
  假定有一个P/L值为5、4、3、2、1构成的序列,那么在所有可能的排序中,5 4 3 2 1应该是最优解。而对于其他排列,比如2 3 5 4 1,用上面的方法调整为最优解的过程,就是其期望E不断变小的过程。这个调整过程是:
      2      3      5      4      1            (1)原始序列,5调到2前面
      5      2      3      4      1            (2)4调到2前面
      5      4      2      3      1            (3)3调到2前面
      5      4      3      2      1            (4)已经找不出序列i...j使得Pj/Lj大于序列中其他值,调整结束
  这个调整过程看上去是不是很熟悉?没错,它和选择排序很像,殊途同归。我一开始没有想到这个期望最小化问题居然能和选择排序扯上了关系,直到挖掘到这一步。同时,用选择排序说明了,所有的序列最终都能转化成一个从大到小的排列,也即,所有序列转化成最优解时,对应期望E都在不断地减少(如果所有P/L都不等),“最优解”确实是最优解

类似题:
“将一个给定的自然数数组,连接起来得到一个数,求这个数的最大值或最小值”。

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts