算法/复杂性 - 最有效的解决方法

时间:2013-04-18 22:23:42

标签: sorting hashtable complexity-theory

所以问题是这个。我有以下作为示例输入,

| ID | A | B |

| 2 | 100 | 200 |

| 3 | 110 | 190 |

| 4 | 105 | 145 |

| 1 | 90 | 150 |

| 5 | 102 | 198 |

目标如下。对于每个ID x,计算其他ID的数量y,其中y的A大于x的A和y的B小于x的B。所以上面例子的输出应该是

| ID |计数|

| 3 | 0 |

| 4 | 0 |

| 1 | 1 |

| 5 | 2 |

| 2 | 3 |

其中ID 3的计数为0,因为它具有最大的A.显然,你可以进行O(n ^ 2)穷举搜索,但效率很低。

我的算法如下。对输入进行两次排序 - 一次是A,一次是B,得到

| ID | A | B |

| 1 | 90 | 150 |

| 2 | 100 | 200 |

| 5 | 102 | 198 |

| 4 | 105 | 145 |

| 3 | 110 | 190 |

| ID | A | B |

| 2 | 100 | 200 |

| 5 | 102 | 198 |

| 3 | 110 | 190 |

| 1 | 90 | 150 |

| 4 | 105 | 145 |

然后从第一个排序表(ID = 1)中的第一个ID开始,并获取具有较大A值的ID(即ID低于它的值 - 2,5,4,3),然后查找ID = 1第二个排序表并查看其下方的ID,每次在原始ID集合中找到一个计数器时,计数器会递增 - 在这种情况下,第二个表中唯一低于1的ID是4,4是{2,5,4} ,3}所以输出为1。

所以排序是O(nlogn),我相信其余的操作是不变的。有更好的方法吗?

0 个答案:

没有答案