0

10,000 レコードを含む JSON があります。各レコードには、'2011-04-29'の形式のタイムスタンプがあります。これで、次の形式の配列を持つクライアント側の配列(これをcalendarと呼びましょう)があります-

['2011-04-26', '2011-05-02', 'Week 1', '2010 - 11']
...

目標は、各レコードのタイムスタンプに週番号を割り当てることです。これを達成するために従来の線形検索を使用することもできますが、10,000 以上の json レコードと 300週間近くのカレンダーがあるため、これはすぐに面倒になります。

あなたは何をお勧めします?

PS - ここでの週は実際の年の週ではなく、別の場所で定義されているため、カレンダーが必要です。

文字列を に変換した場合、これを行うより効率的な方法はありますDate.getTime()か?

4

2 に答える 2

2

わずか 300 週間の場合、私のアプローチは中間ルックアップ オブジェクトを導入し、考えられる各タイムスタンプを適切な週に一致させることです。以下を生成する単純なループを使用するだけです。

{
    '2011-04-26': 1,
    '2011-04-27': 1,
    // ...
    '2011-05-02': 1,
    '2011-05-03': 2,
    '2011-05-04': 2,
    // ...
}

これらの値は、単にcalendar配列内のインデックスになります。

次に、このオブジェクトで簡単なルックアップを使用して、1 万件のレコードを暦週に割り当てることができます。

于 2012-07-18T12:17:56.537 に答える
1

カレンダー レコードが何らかの順序で並べられている限り、二分探索アルゴリズムを適用できます。日付を文字列ではなくタイムスタンプとして保存すると、比較が高速になる可能性があります (ただし、現在の形式では文字列比較も機能します)。

カレンダーを「週」でインデックス化する方がエレガントかもしれません。何かのようなもの

{
  "Week 1": ['2011-04-26', '2011-05-02', '2010 - 11'],
  "Week 2": ['2011-05-03', '2011-05-09', '2010 - 12'],
  ...
}

配列からこのルックアップ オブジェクトを作成するのcalendarは O(n) の複雑さがあるため、1 つのレコードのみを検索する必要がある場合は、元の配列での線形検索でも高速になることに注意してください。

元の配列のサンプル アルゴリズム:

var calendar = [
  ['2011-04-26', '2011-05-02', 'Week 1', '2010 - 11'],
  ['2011-05-03', '2011-05-09', 'Week 2', '2010 - 12'],
  ...
];
function getRecord(date) {
    var l = 0,
        r = calendar.length-1;
    while (l <= r) {
        var m = ~~(l + (r-l)/2);
        var comp = comparefn(this[m]);
        if (calendar[m][1] < date) // last day of week before date
            l = m+1;
        else if (calendar[m][0] > date) // first day of week after date
            r = m-1;
        else // week found
            return calendar[m];
    }
    // I'm not quite sure what happens when a date lies between two weeks in the calendar
    return null;
}
于 2012-07-18T12:25:55.573 に答える