昨日面接をしました。プログラミングの問題の解決策がわからなかったので、ここでいくつかのアイデアを入手したいと思います。問題は:
JavaでTimeWindowBufferを実装する必要があります。これは、時間の経過とともにユーザーが継続的に受け取る番号を格納します。バッファにはmaxBufferSizeがあります。ユーザーは、過去数秒間の平均値、つまりユーザーから渡されたtimeWindowを知りたいと考えています(これはスライディングウィンドウです)。システムから現在の時刻を取得できます(System.currentTimeMills()
Javaなど)。TimeWindowBufferクラスは次のようになります。
public class TimeWindowBuffer {
private int maxBufferSize;
private int timeWindow;
public TimwWindowBuffer(int maxBufferSize, int timeWindow) {
this.maxBufferSize = maxBufferSize;
this.timeWindow = timeWindow;
}
public void addValue(long value) {
...
}
public double getAvg() {
...
return average;
}
// other auxiliary methods
}
例:
たとえば、ユーザーは1秒ごとに数値を受信し(ユーザーは特定の速度で数値を受信しない場合があります)、過去5秒間の平均値を知りたいとします。
入力:
maxBufferSize = 5、timeWindow = 5(s)
numbers = {-5 4 -8 -8 -8 1 6 1 8 5}
出力
(説明のためにここに式をリストしますが、ユーザーは結果のみを必要とします):- 5
/ 1(t = 1)
(-5 + 4)/ 2(t = 2)
(-5 + 4-8)/ 3(t = 3)
(-5 + 4-8-8)/ 4(t = 4)
(-5 + 4-8-8-8)/ 5(t = 5)
(4-8-8-8 + 1)/ 5(t = 6)
(-8-8-8 + 1 + 6 )/ 5(t = 7)
(-8-8 + 1 + 6 + 1)/ 5(t = 8)
(-8 + 1 + 6 + 1 + 8)/ 5(t = 9)
(1 + 6 + 1 + 8 + 5)/ 5(t = 10)
TimeWindowBufferのデータ構造が指定されていないため、値とその追加時間のペアを保持することを考えていました。したがって、基になるバッファの宣言は次のようになります。
private ArrayList<Pair> buffer = new ArrayList<Pair>(maxBufferSize);
どこ
class Pair {
private long value;
private long time;
...
}
ペアは時間順に追加されるため、リストで2分探索を実行し、timeWindowに該当する数値の平均を計算できます。問題は、バッファにmaxBufferSizeがあり(ArrayListにはありませんが)、バッファがいっぱいになったときに最も古い値を削除する必要があることです。そして、その値はまだtimeWindowを満たすことができますが、今ではオフレコになり、いつ期限切れになるかはわかりません。
私は今のところここで立ち往生しています。
直接の答えは必要ありませんが、ここでいくつかの議論やアイデアがあります。問題と私の説明について混乱があれば、今すぐ教えてください。