Arrays 满足关系的元素数

Arrays 满足关系的元素数,arrays,computer-science,computation-theory,computer-science-theory,Arrays,Computer Science,Computation Theory,Computer Science Theory,给定两个数组: 2 5 6 4 3 7 1 5 1 6 2 3 7 4 对两个数组中满足x在y之前的条件的x,y元素进行计数 迄今为止的进展情况: 按索引对数组进行排序。例如: object: 1 2 3 4 5 6 7 indexes in the first array: 6 0 4 3 1 2 5 indexes in the secnod array: 1 3 4 6 0 2 5 并将每个元组与另一个元组进行比较。如果元组a的两个索引都低

给定两个数组:

2 5 6 4 3 7 1
5 1 6 2 3 7 4
对两个数组中满足
x
y
之前的条件的
x,y
元素进行计数


迄今为止的进展情况:

按索引对数组进行排序。例如:

                     object: 1 2 3 4 5 6 7
indexes in the first array:  6 0 4 3 1 2 5
indexes in the secnod array: 1 3 4 6 0 2 5
并将每个元组与另一个元组进行比较。如果元组
a
的两个索引都低于或高于元组
b
,则增加满足条件的元素数

它的时间复杂度为(N^2)/2,所以O(N^2),这太慢了。我知道最坏情况下的复杂度再好不过了,但我最感兴趣的是平均结果。那么:有没有更好的方法/算法

我曾想过使用可传递属性(如果
(x,y)
(y,z)
都满足条件,那么
(x,z)
也满足条件),但运气不好


测试用例

对于阵列:

2 5 6 4 3 7 1
5 1 6 2 3 7 4
1 2 3 4 5 6 7
1 2 3 4 5 6 7
满足条件的对为:

(5,1) (2,3) (2,4) (2,7) (5,3) (6,3) (3,7) (5,4) (6,4) (5,6) (5,7) (6,7)
(1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (2,3) (2,4) (2,5) (2,6) (2,7) (3,4) (3,5) (3,6) (3,7) (4,5) (4,6) (4,7) (5,6) (5,7) (6,7)
对于阵列:

2 5 6 4 3 7 1
5 1 6 2 3 7 4
1 2 3 4 5 6 7
1 2 3 4 5 6 7
满足条件的对为:

(5,1) (2,3) (2,4) (2,7) (5,3) (6,3) (3,7) (5,4) (6,4) (5,6) (5,7) (6,7)
(1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (2,3) (2,4) (2,5) (2,6) (2,7) (3,4) (3,5) (3,6) (3,7) (4,5) (4,6) (4,7) (5,6) (5,7) (6,7)

我非常喜欢思考这个问题。这确实感觉像是一个CS作业问题,所以我将尝试在不解决所有问题的情况下触及概念

海滩男孩原则

我的微积分老师使用的一个术语,实际上是一种非常实用的解决问题的技巧。基本上,如果你有一个棘手的问题,说“如果……”会不会很好,然后看看是否有什么东西可以让事情变得更简单。如果有的话,看看你能不能做到

在这种情况下,如果顶部阵列已订购,只需
[1,2,3…]
,不是很好吗?这将使解决这个问题变得更加容易,因为它将两个数组的问题转化为一个数组的问题

好吧,可以这样!您可以将这些问题中的任何一个映射为具有有序第一个数组的问题

您列出的第一个示例:

2 5 6 4 3 7 1
5 1 6 2 3 7 4
我认为上述问题等同于以下问题:

1 2 3 4 5 6 7
2 7 3 1 5 6 4
映射

我只是对2->15->26->34->43->57->61->7做了一个简单的密码替换(为什么会有这种特殊的映射?)。这使得问题的基本结构保持不变。然后可以解决此问题,然后撤消映射

你会发现这种将一个问题映射成一个更简单问题的技术经常出现在计算机科学中,尤其是在你的算法和可计算性类中

您现在有一个查找所有对的单个数组问题:

2 7 3 1 5 6 4
这个问题的时间复杂性让我留给读者一个练习


另外,不要忘记撤消映射的时间复杂性。有时,您会解决一个问题,认为很容易发现构造和解构映射非常昂贵,您必须返回绘图板。

(x,y)
在您的示例中取值
(2,5),(5,1),…,(1,4)
?在第一个数组中,2在5之前,但在下一个例子中,5比2早。(5,1),但这是事实。(1,4)不是。(6,7)、(5,6)等。。是正确的。啊,好的。你有很多测试用例吗?给我一分钟,我会生成一些。添加了两个测试用例,其中包含满足条件的元组的完整列表。谢谢你的回答。我会努力的。PS:您创建的等效问题中有一个输入错误,它应该是
27331564
,而不是
2631564
。否则它看起来是非常正确的。捕捉得好!修正了。抱歉,我看不出这有什么帮助。你把这个问题转化成了另一个问题,而这种转化是有道理的,因为它使事情变得更容易。但最终,您只有一个数组,在这个数组上计算解决方案仍然很困难(即O(n*2)),除非您应用了一些可以同样应用于原始数组的技术。例如,在一个数组问题中,利用传递属性要容易得多。尽管如此,我必须承认,尽管我让程序运行得快了一点,但我离令人垂涎的时间复杂性还有很远的距离。