|
10 | 10 | * @private |
11 | 11 | * @param {Array} array The array in which the largest |
12 | 12 | * element should be found. |
13 | | - * @param {Function} cmp Function used for comparison. |
14 | 13 | * @return {Number} index of the first largest element |
15 | 14 | */ |
16 | | - function max(array, cmp) { |
| 15 | + function max(array) { |
17 | 16 | if (!array || !array.length) { |
18 | 17 | return -1; |
19 | 18 | } |
20 | | - if (!cmp) { |
21 | | - cmp = function (a, b) { return a - b; }; |
22 | | - } |
23 | 19 | var maxIdx = 0; |
24 | 20 | for (var i = 1; i < array.length; i += 1) { |
25 | | - if (cmp(array[maxIdx], array[i]) < 0) { |
| 21 | + if (array[maxIdx].distance < array[i].distance) { |
26 | 22 | maxIdx = i; |
27 | 23 | } |
28 | 24 | } |
|
33 | 29 | * Default comparison method. |
34 | 30 | * @private |
35 | 31 | */ |
36 | | - function cmp(a, b) { |
37 | | - return a.distance - b.distance; |
| 32 | + function asc(a, b) { |
| 33 | + return a - b; |
38 | 34 | } |
39 | 35 |
|
40 | 36 | /** |
|
46 | 42 | * @param {Array} array The input array. |
47 | 43 | * @return {Object} Graph represented with list of neighbours. |
48 | 44 | */ |
49 | | - function buildDag(array) { |
| 45 | + function buildDag(array, cmp) { |
50 | 46 | var result = []; |
51 | 47 | for (var i = 0; i < array.length; i += 1) { |
52 | 48 | result[i] = []; |
53 | 49 | for (var j = i + 1; j < array.length; j += 1) { |
54 | | - if (array[i] < array[j]) { |
| 50 | + if (cmp(array[i], array[j]) < 0) { |
55 | 51 | result[i].push(j); |
56 | 52 | } |
57 | 53 | } |
|
87 | 83 | neighboursDistance[i] = find(dag, neighbours[i]); |
88 | 84 | } |
89 | 85 |
|
90 | | - maxDist = max(neighboursDistance, cmp); |
| 86 | + maxDist = max(neighboursDistance); |
91 | 87 | maxNode = neighbours[maxDist]; |
92 | 88 | distance = 1 + neighboursDistance[maxDist].distance; |
93 | 89 | find.memo[node] = result = { |
|
114 | 110 | * @param {Array} array Input sequence. |
115 | 111 | * @return {Array} Longest increasing subsequence. |
116 | 112 | */ |
117 | | - return function (array) { |
| 113 | + return function (array, cmp) { |
| 114 | + cmp = cmp || asc; |
118 | 115 | var results = []; |
119 | | - var dag = buildDag(array); |
| 116 | + var dag = buildDag(array, cmp); |
120 | 117 | var maxPath; |
121 | 118 | find.memo = []; |
122 | 119 | for (var i = 0; i < array.length; i += 1) { |
123 | 120 | results.push(find(dag, i)); |
124 | 121 | } |
125 | | - maxPath = results[max(results, cmp)]; |
| 122 | + maxPath = results[max(results)]; |
126 | 123 | results = []; |
127 | 124 | while (maxPath) { |
128 | 125 | results.push(array[maxPath.node]); |
|
133 | 130 | })(); |
134 | 131 |
|
135 | 132 | })(typeof window === 'undefined' ? module.exports : window); |
| 133 | + |
0 commit comments