O(n)よりも素早く要素を見つけることができるデータ構造またはソリューションを探していますと見つかった要素の前の要素を取得しますリスト内の要素を検索して前の要素を取得する(両方とも高速である必要があります)
私のケースでは、が既に埋め込まれてソートされています。、DateTimeで要素を見つける必要があり、以前のx要素を返す必要があります。
私はLinkedListで試しましたが、検索が遅すぎましたo(n)。 私はDateTimeで見つけることができるように辞書を使うことも考えましたが、前の要素を得るために逆順にループする方法はわかりません。
class FinancialQuote
{
public DateTime TradingDate;
public double Price;
protected bool Equals(FinancialQuote other)
{
return TradingDate.Equals(other.TradingDate);
}
}
public void Main()
{
var quotes = new LinkedList<FinancialQuote>();
// quotes are populated here
var result = new List<FinancialQuote>();
var howManyQuotes = 2;
// the goal here is to find quote4 and returns quote3 and quote2
var currentNode = quotes.Find(quote4); // O(N) which is too slow
for (int i = 0; i < howManyQuotes; i++)
{
var previousClose = currentNode.Previous.Value;
result.Add(previousClose);
currentNode = currentNode.Previous;
}
}
だから私の変数をもたらすはずがquote3とquote2
*既に入力されてソートされています。あなたが後で検索する必要がある 'TradingDate'によって? –
BinarySearchを使用するよりも索引付けが速くなりますが、設定に時間がかかり、明らかにそれ以上のスペースが必要な場合は、そのような辞書を使用しても問題ありません。あなたが何を求めているのか分かりません。 E:基本的にLinkedListの使用をやめてください。私は文字通りそれが有用であることを見たことはありません。オーバーヘッドは、ほとんどすべてのケースで一定の時間の挿入と削除の利点を上回ります。 – harold
@harold:1)辞書を通って前方/後方にループすることは自明ではありません。 2)「ほぼすべての場合」の「LinkedList」オーバーヘッドに関する記述は理解できません。長所と短所はよく知られています。何度も挿入したり削除したりするための構造が必要で、巨大なリストを扱っているのなら、それは*選択構造です。 – Lou