在多个阵列中查找序列号的有效方法是什么?

时间:2016-12-06 20:43:40

标签: arrays algorithm computer-science

我不是在寻找任何代码或为我做任何事情。我需要一些帮助才能开始朝着正确的方向前进但不知道如何去做。如果有人可以提供一些如何解决这些问题的资源,我将非常感激。我和我的笔记本坐在一起,我在设计一个可以做我想做的事情的算法时遇到了麻烦。

我可能会这样做:

foreach element in array1
    foreach element in array2
        check if array1[i] == array2[j]+x

我相信这对前向和后向序列都有效,对于倍数只需检查array1[i] % array2[j] == 0。我有一个包含int数组的列表,我得到list[index]array1}和list[index+1] array2,但这个解决方案可以快速复杂和冗长,特别是对于大型数组和这些数组的大列表。因此,我正在寻找更好的解决方案。


我正在尝试提出一种在不同阵列中查找序列号的算法。

例如:

[1, 5, 7][9, 2, 11]会发现12是连续的。

这也适用于多个数组中的多个序列。因此,如果存在第三个[24, 3, 15]数组,它将在该序列中包含3,并继续到下一个数组,直到没有与last sequential element + 1匹配的数字。

它也应该能够在数组之间找到多个序列。

例如:

[1, 5, 7][6, 3, 8]会发现56是顺序的,78也是顺序的。


我也有兴趣找到反向序列。

例如: [1, 5, 7][9, 4, 11]会返回54会反向顺序。


全部示例:

[1, 5, 8, 11][2, 6, 7, 10]将返回12将是连续的,56是连续的,87是反向顺序的,1110是反向顺序的。

它也可以重叠:

[1, 5, 7, 9][2, 6, 11, 13]将返回12顺序,56顺序以及7和{ {1}}反向顺序。

我还希望对此进行展开,以检查差异为6的数字(上面的示例请检查x之差)。



除了所有这些(虽然这可能是一个不同的问题),我还想检查倍数,

实施例: 1[5, 7, 9]会将[10, 27, 8]5作为倍数,109作为倍数返回。

和具有相同位置的数字。

实施例: 27[3, 5, 7]会返回[13, 23, 25]313会有相同的数字。

2 个答案:

答案 0 :(得分:1)

您的伪代码中概述的强力方法将为O(c^n)(指数),其中c是每个数组的平均元素数,n是总数组的数量。< / p>

如果输入空间稀疏(意味着平均丢失的数字比呈现数字更多),那么加速此过程的一种方法是首先创建所有的一个有序集合来自所有不同阵列的唯一编号。这个&#34;大师&#34;然后,set将允许您在任何不可行的序列上提前退出(即循环中的break语句)。

例如,如果我们有输入数组[1, 5, 7][6, 3, 8]以及[9, 11, 2],则主有序集将为{1, 2, 3, 5, 6, 7, 8, 9, 11}。如果我们正在寻找n+1类型序列,我们可以跳过继续检查包含3911的任何序列(因为{(1}}值不存在于排序集中的下一个索引。虽然在这个特定示例中加速不是很激烈,但如果你有数百个输入数组和n+1的非常大的值范围(稀疏性,然后加速应该是指数的,因为你将能够提前退出许多排列。如果输入空间不稀疏(例如在这个例子中我们没有很多洞),加速将是低于指数。

进一步的改进是存储&#34;主人&#34;一组键值对,其中键是n值,如上例所示,该对的值部分是包含该值的任何数组的索引列表。之前示例的主集将是:n。使用此体系结构,扫描时间可能会低至{[1, 0], [2, 2], [3, 1], [5, 0], [6, 1], [7, 0], [8, 1], [9, 2], [11, 2]},因为您可以遍历此单个已排序的主集,查找有效序列,而不是遍历所有子数组。通过还要求数组索引递增,您可以清楚地看到可以跳过O(c*n)序列,因为数组的顺序不正确,并且与1->2序列相同,等等。注意这个玩具示例有点过于简单,因为在实践中,您需要键值对的值部分的索引列表。如果2->3的相同值出现在多个数组中(重复值),则必须这样做。

答案 1 :(得分:1)

使用字典(set或hashmap)

dictionary1 = {}

浏览第一个数组中的每个项目并将其添加到字典中。 [1, 5, 7]

现在dictionary1 = {1:true, 5:true, 7:true}

dictionary2 = {}

现在浏览[6, 3, 8]中的每个项目,然后查找它是否是序列的一部分。

6是序列的一部分,因为dictionary1[6+1] == true 所以dictionary2[6] = true

我们得到dictionary2 = {6:true, 8:true}

现在设置dictionary1 = dictionary2dictionary2 = {},然后转到第三个数组..依此类推。

我们只跟踪序列。 由于每个查找都是O(1),并且我们每个数字执行2次查找(例如6-1和6 + 1),总数是n * O(1),即O(N)(N是数字的数量)跨越所有阵列。)