2017-08-22 8 views
1

次の問題のパフォーマンス関数を作成する際に問題があります。私はタイムテーブルを作成しています。列の項目の配列を分割して、開始/終了時間の範囲で1時間を共有する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; 
} 

答えて

0

すべての期間が終了のためのトリプレット{Time, StartOrEnd, ItemId}の配列/リストを作成します。
ここ StartOrEnd間隔の開始のための+1あり、かつ間隔

の終わりのための-1Timeキーによってそれらをソートします。 Timeためのタイが(同じ回)発生した場合、二次キーを使用:-1

+1前に現在のレコードの割り当て ItemId Counter

に現在のレコードの値をStartOrEndを追加、アレイを通してCounter=0

ウォークを作りますカラム

1

問題はInterval schedulingに似ています。 this(C++言語)のような最適解を見つけることができます。

関連する問題