循环队列算法问题

时间:2012-07-07 18:40:04

标签: arrays algorithm

我正在尝试执行以下操作,并且无法确定在没有崩溃或无限循环的情况下它是如何完成的:

我必须创建一个队列,我必须在其中分配不同的任务次数,或者使用这种信息:

  • 任务X:[NextOne,LastOne]

    • 任务1:[30,32]
    • 任务2:[76,81]
    • 任务3:[2,2]
    • 任务4:[5,8]

意味着“任务X”将成为“LastOne - NextOne”次,如果两者相等,则不会入队,并且它们按X顺序进入队列。 在此示例中,队列应如下所示:

FIRST
Task1[30]
Task2[76]
Task4[5]
Task1[31]
Task2[77]
Task4[6]
Task1[32]
Task2[78]
Task4[7]
Task2[79]
Task4[8]
Task2[80]
Task2[81]
LAST

这不是语言问题,更多的是我在这里的算法问题。使用PHP我做了以下内容:

$tasks = array(
'Task1' => array(30,32),
'Task2' => array(76,81),
'Task3' => array(2,2),
'Task4' => array(5,8)
);


$aux = array();
$i=0;
foreach($tasks as $s=>$n) {
    $aux[$i]['task'] = $s;
    $aux[$i]['times'] = $n[1]-$n[0];
    $aux[$i]['first'] = $n[0];
    $i++;
}

但是你想象这实际上什么都不做,只需改变信息的形状。我真的被困在这里我不知道为什么,这实际上应该不难理解。我很感激任何帮助。

3 个答案:

答案 0 :(得分:1)

我猜你可以使用$s作为哈希(或等效数组)的键,只要在遇到具有相同键的元素时将值增加1。在这种情况下,默认值为0。

例如,

Task1 =>阵列(30,32)

将按照

的顺序排列
Task1[30] (default value to 0)
...
...
Task1[31] (add 1 which becomes 1)
...
Task1[32] (add 1 which becomes 2)

这意味着Task1总共出现了3次,最终的times值应为2。

我认为您可以使用array_key_exists辅助函数来检查先前是否出现了某个任务。

答案 1 :(得分:1)

在python中(我可能会误解你的“这不是语言问题”评论 - 原谅我):

tasks = [
    ("Task1", 30, 32),
    ("Task2", 76, 81),
    ("Task3", 2, 2),
    ("Task4", 5, 8) ]

while not tasks == []:
    # Pop first task off the current list
    (n, s, e) = tasks[0]
    tasks = tasks[1:]

    print n, s
    if s != e:
        tasks.append( (n, s+1, e) )

对不起它不是在php中 - 这不是我的强项,但也许这会有所帮助?输出:

Task1 30
Task2 76
Task3 2
Task4 5
Task1 31
Task2 77
Task4 6
Task1 32
Task2 78
Task4 7
Task2 79
Task4 8
Task2 80
Task2 81

答案 2 :(得分:1)

在C#

结果如您所愿。

我添加了一个数字作为标志:1 =不排队,2 =任务的最后记录。

效率不高但有效!

private static void Main()
{
    var tasks = new Dictionary<string, int[]>
                    {
                        {"Task1", new[] {30, 32, 0}},
                        {"Task2", new[] {76, 81, 0}},
                        {"Task3", new[] {2, 2, 0}},
                        {"Task4", new[] {5, 8, 0}}
                    };
    int loopCounter = 0;
    Console.WriteLine("FIRST");
    while (loopCounter < tasks.Count)
    {
        foreach (var task in tasks)
        {
            if (task.Value[0] == task.Value[1])
            {
                if (task.Value[2] == 2)
                {
                    loopCounter++;
                    Console.WriteLine(task.Key + "[" + task.Value[0] + "]");
                    task.Value[2] = 1;
                }
                else if (task.Value[2] == 0)
                {
                    loopCounter++;
                    task.Value[2] = 1;
                }
            }
            else
            {
                Console.WriteLine(task.Key + "[" + task.Value[0] + "]");
                task.Value[0]++;
                if (task.Value[0] == task.Value[1])
                    task.Value[2] = 2;
            }
        }
    }
    Console.WriteLine("LAST");
    Console.ReadLine();
}

输出:

FIRST
Task1[30]
Task2[76]
Task4[5]
Task1[31]
Task2[77]
Task4[6]
Task1[32]
Task2[78]
Task4[7]
Task2[79]
Task4[8]
Task2[80]
Task2[81]
LAST

希望这有帮助。