以最低键值获取键值对的最便宜方法



我想要一个将浮点数的键值对存储到整数的集合(浮点数是键)。然后,我想找到数字最小的键值对。因此,我本质上想使用最低的关联浮点键获取 int 值。

也许一个根据键使它们保持排序并允许我索引到它以便抓取索引 0 处的对象的集合是合适的?但是,我不确定从哪里开始寻找这个。

你可以

试试SortedDictionary。 如果您致电.钥匙在它上面,你会得到一个排序的钥匙集合。 然后,可以使用 LINQ .First() 函数获取集合中的第一个键,例如:

var mySortedDictionary = new SortedDictionary<float, int>();
// ...
// Add some values to dictionary
// ...
// Note, you will need the System.Linq namespace for First()
float firstKey = mySortedDictionary.Keys.First();
int firstValue = mySortedDictionary[firstKey];
// If you just need the value:
int firstValue2 = mySortedDictionary.Values.First();

如果需要获取第一个或最后一个密钥以外的密钥,可以使用 LINQ .ToArray() 或 .ToList() 函数返回可索引数组或列表,如下所示:

float[] indexableKeys = mySortedDictionary.Keys.ToArray();
int[] indexableValues = mySortedDictionary.Values.ToArray();

此外,以下代码将循环访问集合,并按排序顺序为您提供所有键值对:

foreach (var pair in mySortedDictionary)
{
    int key = pair.Key;
    // Do stuff with key...
    object value = pair.Value;
    // Do stuff with value...
}

作为替代方法,您也可以使用可索引的 SortedList。 要使用它,您只需要以下代码:

var mySortedList = new SortedList<float, int>();
// ...
// Add some values to sortedlist
// ...
int firstValue = mySortedList.Values[0];

注意:我没有机会对其中任何一个进行基准测试,所以我不确定哪个会表现更好。 使用排序集合肯定比常规集合有更多的开销。 如果您只需要知道哪个键是第一个键,则最好创建一个自定义类,其中包含一个字典和一个私有字段private float first;,用于存储哪个键是第一个键。 当您添加到该类时,它会将 KeyValuePair 定向到字典中,并检查键是否小于first变量(或者字典中是否没有键)。 如果是这样,它会first设置为新密钥。 删除值时,将再次将其从字典中删除。 如果键等于您的first值,则需要对 Dictionary.Keys 集合进行排序并首先找到新的。 这可能会表现最好,但你必须自己编写类。

注意:在做了一些基准测试后,我发现 SortedDictionary 的删除速度更快,但 SortedList 的添加和索引速度更快。 这是通过用 1,000,000 个 keyValue 对填充常规字典来完成的(键被洗牌,以便它们以随机顺序输入)。 然后我:

  • 将这些对中的每一个都添加到两个排序集合中
  • 对两个排序集合中的每个键执行了查找
  • 通过在两个排序集合上调用 Remove(Key) 来删除每个对

SortedList 在添加或索引时的速度大约是其两倍,但删除每个元素所需的时间大约是其 1000 倍。

当然,

您可以使用任何完全排序的数据结构。但是"完全排序"的部分当然会涉及一些开销。

如果只检索最低键,那么"优先级队列"通常是最好的数据结构。这里提出了一个适当的问题。

最新更新