问题出现了一个数组函数

时间:2010-09-07 15:39:31

标签: algorithm language-agnostic math function

假设我有一个递增的整数序列:seq = [1,1,1,2,2,2,2,2,3,3,4 ...]不能保证具有完全相同的数字每个整数但保证增加1。

是否有一个函数F可以对这个序列进行操作,当序列中的整数等于x而所有其他整数都为0时,F(seq,x)会给我全1。

例如:

t = [1,1,1,1,2,2,3,3,3,4]

F(t,2)= [0,0,0,0,1,1,0,0,0,0]

编辑:我可能应该更清楚。有没有一个解决方案,我可以对整个数组进行一些代数运算,以获得所需的结果,而无需迭代它?

所以,我想知道我是否可以这样做:F(t,x)= t op x?

在Python(t是numpy.array)中,它可能是:

(t * -1)%x或其他......

EDIT2:我发现身份函数I(t [i] == x)可以作为代数运算使用。对不起,我不知道身份功能。

7 个答案:

答案 0 :(得分:2)

这是一个非常简单的解决方案,不需要您对域进行大多数限制。只需创建一个相同大小的新数组,循环并测试数组中元素与要比较的值之间的相等性。当它们相同时,将新数组中的相应元素设置为1.否则,将其设置为0.实际实现取决于您正在使用的语言,但应该相当简单。

如果我们考虑您的域名,您可以引入一些优化。如果你从一个零数组开始,你只需要填写那些零。您知道在(n - 1)元素之前不需要开始检查,其中n是您要比较的值,因为必须至少有一个数字1n递增顺序。如果您不必从1开始,您仍然可以从(n - start)开始。同样,如果您未在array[n - 1]遇到此问题,则可以跳转n - array[n - 1]个元素。您可以重复此操作,尽可能多地跳过大部分元素,直到您点击正确的值或列表的末尾(如果它根本不在那里)。

完成处理所需的值后,无需检查数组的其余部分,因为您知道它总是会增加。所以你也可以提早停止。

答案 1 :(得分:0)

一个简单的方法(使用C#代码)是简单地迭代序列并测试它,返回1或0。

foreach (int element in sequence)
   if (element == myValue)
       yield return 1;
   else 
       yield return 0;

(使用LINQ编写)

sequence.Select(elem => elem == myValue ? 1 : 0);

答案 2 :(得分:0)

dichotomy algorithm可以快速找到t[x] = n及时产生子线性复杂度函数的范围。

答案 3 :(得分:0)

您是否要求提供现成的c ++,java API或者您要求算法?或者这是家庭作业的问题吗?

我看到了从头到尾扫描阵列并与每个阵列进行比较的简单算法。如果等于然后将其他1放置为0.无论如何将元素放入数组中,您将必须访问新数组的每个元素至少一个。所以整体方法将是O(1)。

您当然可以通过启动二进制搜索来减少比较。找到所需的号码后,只需前进和后退搜索相同的号码即可。

答案 4 :(得分:0)

这是一个返回新数组的java方法。

public static int[] sequence(int[] seq, int number)
{
    int[] newSequence = new int[seq.length];

    for ( int index = 0; index < seq.length; index++ )
    {
        if ( seq[index] == number )
        {
            newSequence[index] = 1;
        }
        else
        {
            newSequence[index] = 0;
        }
    }

    return newSequence;
}

答案 5 :(得分:0)

我会初始化一个零数组,然后对序列进行二元搜索,找到符合条件的第一个元素,并且只从那里开始设置1。一旦你有一个不平等的条件,停止。

答案 6 :(得分:0)

这是在O(log n)

中执行此操作的方法
>>> from bisect import bisect
>>> def f(t, n):
...     i = bisect(t,n-1)
...     j = bisect(t,n,lo=i) - i
...     return [0]*i+[1]*j+[0]*(len(t)-j-i)
...         
... 
>>> t = [1, 1, 1, 1, 2, 2, 3, 3, 3, 4]
>>> print f(t, 2)
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0]