首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将信号灯组织成金字塔

将信号灯组织成金字塔
EN

Code Review用户
提问于 2013-11-01 00:24:44
回答 3查看 396关注 0票数 6

我的作业是把信号灯组织成金字塔。任务已经完成了,但我最终得到了一个长期丑陋的条件,我想知道是否有人能看到一个更好的方法/算法来完成同样的事情。

代码语言:javascript
运行
复制
if (me==0) {
    wait_sem(semaphore[1]);
    wait_sem(semaphore[2]);
    signal_sem(semaphore[0]);

}

if (me==1) {
    wait_sem(semaphore[3]);
    wait_sem(semaphore[4]);

}
if (me==2) {
    wait_sem(semaphore[4]);
    wait_sem(semaphore[5]);

}

if (me==3) {
    wait_sem(semaphore[6]);
    wait_sem(semaphore[7]);

}
if (me==4) {
    wait_sem(semaphore[7]);
    wait_sem(semaphore[8]);

}
if (me==5) {
    wait_sem(semaphore[8]);
    wait_sem(semaphore[9]);

}
if (me==6) {
    wait_sem(semaphore[10]);
    wait_sem(semaphore[11]);

}
if (me==7) {
    wait_sem(semaphore[11]);
    wait_sem(semaphore[12]);

}
if (me==8) {
    wait_sem(semaphore[12]);
    wait_sem(semaphore[13]);

}

if (me==9) {
    wait_sem(semaphore[13]);
    wait_sem(semaphore[14]);

}
EN

回答 3

Code Review用户

发布于 2013-11-01 01:17:46

我甚至不会在这里使用switch

代码语言:javascript
运行
复制
wait_sem(semaphore[me*2+1]);
wait_sem(semaphore[me*2+2]);
if (me==0) {
    signal_sem(semaphore[0]);    
}

编辑:我看到序列不是很线性的。如果您能够在me和索引之间找到一个简单的映射,这将有效(但使用不同的公式)。否则,switch语句可能是最简单的方法。

您还可以通过将输入的ints映射到两个索引( switch )来将std::map<int, std::pair<int, int> >隐藏在映射中。它本质上做了同样的事情,但是您可以在头文件中隐藏丑陋的内容。

票数 4
EN

Code Review用户

发布于 2013-11-01 00:39:46

在这种情况下,开关语句是非常有用的。它们也比您的系列if语句更高效,这些语句必须检查所有语句,即使在找到要查找的语句之后也是如此。switch将立即分支到正确的一个,并跳过所有其他的。这有用吗?

代码语言:javascript
运行
复制
switch(me)
{
  case 0:
  wait_sem(semaphore[1]);
  wait_sem(semaphore[2]);
  signal_sem(semaphore[0]);
  break;

  case 1:
  wait_sem(semaphore[3]);
  wait_sem(semaphore[4]);
  break;

  //etc.

}
票数 1
EN

Code Review用户

发布于 2013-11-01 01:38:36

你总是等待两个信号量,有时发出一个信号量。通过计算要等待的信号量的索引,可以缩短代码:

代码语言:javascript
运行
复制
assert(me >= 0);

if (me < 10) {
    // Find the unique n s.t. T_n <= me < T_{n+1} where {T_n}_n are the triangular numbers
    int n = (int)(0.5 * (sqrt(1+8*me)-0.99));
    // then calculate nextPos := me + (T_{n+1} - T_n)
    int nextPos = me + n + 1;
    wait_sem(semaphore[nextPos]);
    wait_sem(semaphore[nextPos + 1]);
}

if (me == 0) {
    signal_sem(semaphore[0]);    
}
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/33626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档