反馈以改进慢速算法

时间:2017-08-22 18:42:51

标签: algorithm performance sorting

我无法为以下问题创建高性能功能。我正在建立一个时间表,我需要在列中分隔一系列项目,这样就没有列有2个项目在开始/结束时间范围内共享一小时。

我当前的解决方案有效,但是在最糟糕的情况下进行了大量浪费计算,其中所有项目具有相同的小时范围,并且每个项目创建一个新列。

function getItemsPerColumn(items) {
  let itemsPerHour = {},
      itemsPerColumn = {},
      itemsCount = items.length,
      currentHour = 8,
      columnIndex = 1;

  items.forEach(item => {
    let start = moment(item.startHour),
        end = moment(item.endHour),
        startHour = start.format('H'),
        endHour = end.format('H');

    if (itemsPerHour[startHour] === undefined) { itemsPerHour[startHour] = []; }
    itemsPerHour[startHour].push({
      rowStart: startHour,
      rowEnd: endHour,
      item: item
    });
  });

  while (itemsCount > 0) {
    if (itemsPerHour[currentHour] !== [] && itemsPerHour[currentHour] !== undefined) {
      if (itemsPerColumn[columnIndex] === undefined) { itemsPerColumn[columnIndex] = []; }
      let nextHour = itemsPerHour[currentHour][0].rowEnd;
      itemsPerColumn[columnIndex].push(itemsPerHour[currentHour].shift());
      currentHour = nextHour - 1;
      itemsCount--;
    }
    if (currentHour === 18) {
      currentHour = 8;
      columnIndex++;
    }
    else currentHour++;
  }
  return itemsPerColumn;
}

2 个答案:

答案 0 :(得分:1)

您的问题与Interval scheduling类似。您可以找到最适合的解决方案,如this(C ++语言)。

答案 1 :(得分:0)

为所有间隔结束制作三元组{Time, StartOrEnd, ItemId}的数组/列表 对于间隔的开始,StartOrEnd +1-1,对于间隔结束,TimeTime

-1键对其进行排序。如果发生+1的平局(等时),请在Counter=0之前使用辅助密钥:StartOrEnd

制作Counter

遍历数组,将当前记录值的ItemId添加到Counter-th

将当前记录的// [...] PrintStream getPrintStream() { if (printStream == null) { OutputStream output = new OutputStream() { ByteArrayOutputStream baos = new ByteArrayOutputStream() @Override public void write(int b) throws IOException { baos.write(b) } @Override public void flush() { logger.debug(this.baos.toString()) baos = new ByteArrayOutputStream() } } printStream = new PrintStream(output, true) // true: autoflush must be set! } return printStream } // [...] 分配到1.jpeg