给定一个长序列的 N(不一定是不同的)数字,比如说
{1, 50, 3, 99, 1, 2, 100, 99, 4, 100, 4, 100} (could be very long)
和一小组 M 有序对,比如说
(1, 2)
(2, 1)
(1, 3)
(99, 50)
(99, 100)
我想检测有序对是否出现在列表中的任何位置(它们可以分开,但顺序很重要)。例如,上面的计数将是:
(1, 2): 2 (each 1 pairs with the later 2)
(2, 1): 0 (no 1's come after the 2)
(1, 3): 1 (only one of the 1's come before the 3)
(99, 50): 0 (no 99's come before the 50)
(99, 100): 5 (3 times for the first 99 and 2 times for the second)
假设有序对中的每个数字都保证出现在列表中,是否存在一种算法可以比简单的 O(N * M) 时间更快地提取这些计数(通过蛮力搜索每个有序对来实现)?
作为一个附带问题,如果我们将自己限制为仅出现布尔值而不是计数,是否会有一种快速算法?那是:
(1, 2): yes
(2, 1): no
(1, 3): yes
(99, 50): no
(99, 100): yes
任何帮助,将不胜感激。