タイムスタンプ (時間) が連続していないが (簡単にするために想定できます) 一意であるタプルを含むテーブルがあります。
time | value
------------
0 |4
3 |2
5 |6
8 |10
9 |5
13 |-1
15 |-3
... |...
「時間 T が与えられた次のタプル」( <- next(T);) を見つけるという問題に直面しています。たとえば、next(4) -> <5,6>、または next(5) -> <8, 10>. さらに、このデータは MySQL データベースに保持されているため、SQL でこれを実現したいと考えています。ただし、時間の制約により、O (log n) でそれぞれのタプルを見つける必要があります。
一見すると、次の SQL ステートメントを試してみました (疑似コードが理解できることを願っています)。
<time, value> = next(T) {
return (select * from table
where time = (select min(time) from table
where time > T))
}
ただし、これでは適切な時間内に結果が得られません。「時間>検索のテーブルから分(時間)を選択する」にはO(n)時間がかかると思います。もちろん、順序付けられたリストで検索を実行するのに O(log n) 時間しかかからないことは知っていますが、SQL でそれを行う方法はわかりません。これは可能ですか?もしそうなら、それはどのように機能しますか?
ありがとう!
ご参考までに:
(1) 現時点では、私のソリューションはそれぞれのデータをメモリにキャッシュし、最初に並べ替えます。このようにして、O(log n) 時間で次のタプルを見つけることができます。ただし、これは大量のメモリを消費するため、キャッシュなどに関して高度に最適化されている DBMS で「インライン」で実行することをお勧めします。
(2) データベースでデータが時間順に保持されるソリューションを想像できますが、順序付けを確実にする方法や、SQL でそれぞれの検索アルゴリズムを実装する方法がわかりません。:-/
(3) インデックス作成などを認識しており、時間を主キーとして宣言するとパフォーマンスが向上することはわかっていますが、O(log n) で次を見つける方法がわかりません。