产生这些序列的有效方法

时间:2012-09-28 17:16:48

标签: algorithm data-structures

问题: 我需要生成以下序列。我有矩阵的顺序作为输入。

示例:
我需要生成其元素的位置序列。

 (0,0),(0,1),(1,0),(1,1) ->for order 2
 (0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2) -> for order 3.

我需要具备为我这样做的功能。当我调用此函数时,它应该为我计算。我不想将序列存储在内存中。

例如:

first_call - > return value (0,0)
second_call to function - > return value ( 0,1)
...and so on...

您可以将这些值存储在某些全局变量中。

PS:
由于应用程序是多线程的,因此该函数必须是线程安全的。我知道这种情况没有区别。只是想传达整个问题。

精密:
我已经尝试过我的解决方案,但我认为它的效率很高。我正在寻找一种有效的方法来做到这一点。你可以提一下这些步骤。我不需要以任何特定语言实现。如果问题需要更多信息,请告诉我。

3 个答案:

答案 0 :(得分:2)

使用全局变量存储调用函数的次数。称之为t。如果订单是order,那么

f =(t div ordert mod order

其中div是整数除法(例如5 div 3 = 1),mod是模数(即除法的余数)。 (例如5 mod 3 = 2)。

所以在Java中例如:

public class MyCounter {

    private static int t = 0;

    public static int[] myFunction(int order) {
        return new int[] { t / order , t++ % order };
    }

    public static void main(String[] args) {
        int order = 3;
        for(int i=0; i<order*order; i++) {
            int[] k = myFunction(order);            
            System.out.println("("+k[0]+", "+k[1]+")");
        }
    }
}

答案 1 :(得分:0)

#define MATRIX_ORDER 3

void NextPosition(int aIndex, int& aRow, int& aColumn)
{
    if (aColumn == MATRIX_ORDER - 1)
    {
        aRow++;
        aColumn = 0;
    } else {
        aColumn++;
    }
}


void SomeFunction()
{
    int index = 0;
    int row = 0;
    int column = -1;

    while (index < (MATRIX_ORDER * MATRIX_ORDER))
    {
        NextPosition(index, row, column);
        printf("index: %d, row: %d, column: %d\n", index, row, column);
        index++;
    }
}

输出:

index: 0, row: 0, column: 0
index: 1, row: 0, column: 1
index: 2, row: 0, column: 2
index: 3, row: 1, column: 0
index: 4, row: 1, column: 1
index: 5, row: 1, column: 2
index: 6, row: 2, column: 0
index: 7, row: 2, column: 1
index: 8, row: 2, column: 2

答案 2 :(得分:0)

这是使用生成器的Python解决方案:

def sequence_gen(order=2):
    for i in range(order*order):
        yield divmod(i, order)


for val in sequence_gen(2):
    print(val)

#(0, 0)
#(0, 1)
#(1, 0)
#(1, 1)

for val in sequence_gen(3):
    print(val)

#(0, 0)
#(0, 1)
#(0, 2)
#(1, 0)
#(1, 1)
#(1, 2)
#(2, 0)
#(2, 1)
#(2, 2)