所以问题是这个。我有以下作为示例输入,
| 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),我相信其余的操作是不变的。有更好的方法吗?