Data structures O(1)从范围内的键中查找值

Data structures O(1)从范围内的键中查找值,data-structures,language-agnostic,range,key-value,Data Structures,Language Agnostic,Range,Key Value,什么样的数据结构允许我从一组有序范围(如键)中的给定键获得相应的值,而我的键不一定在该集中 考虑一下,[键,值]: [3, 1] [5, 2] [10, 3] 查找3或4将返回1,5-9将返回2,10将返回3。范围不是恒定大小 如果可能的话,O(1)或类似的O(1)很重要 一个平衡的二叉搜索树将为您提供O(logn)。在这个场景中,我将使用I字典。使用键检索值非常快,接近O(1) Dictionary myDictionary=newdictionary(); myDictionary.Add

什么样的数据结构允许我从一组有序范围(如键)中的给定键获得相应的值,而我的键不一定在该集中

考虑一下,[键,值]:

[3, 1]
[5, 2]
[10, 3]
查找3或4将返回1,5-9将返回2,10将返回3。范围不是恒定大小


如果可能的话,O(1)或类似的O(1)很重要

一个平衡的二叉搜索树将为您提供O(logn)。

在这个场景中,我将使用I字典。使用键检索值非常快,接近O(1)

Dictionary myDictionary=newdictionary();
myDictionary.Add(3,1);
myDictionary.Add(5,2);
myDictionary.Add(10,3);
//如果知道密钥存在,可以使用
int value=myDictionary[3];
//如果不知道键是否在字典中,请使用TryGetValue方法
int值;
if(myDictionary.TryGetValue(3,输出值))
{
//已找到密钥,相应的值存储在“值”中
}

有关更多信息:

键索引数组如何?比方说,您知道您的密钥低于1000,只需用值填充
int[1000]
,如下所示: [0,0] [1,0] [2,0] [3,1] [4,1] [5,2] ...... 等等这将为您提供o(1)性能,但会带来巨大的内存开销

否则,哈希表是我所知道的最接近的。希望能有帮助。 编辑:查找,这是一个自平衡树,最坏的情况是o
(logn)搜索。

对于任意键,我怀疑经典计算机中是否存在这样的东西。只有两种可能性1)O(logn)与-O(1)相似2)键中有一个可计算模式(例如,恒定的步幅),基本上您会退回到数组类型的存储。这是不存在的。您可以将其设置为对数时间,但决不能将其设置为常数时间。不幸的是,键是内存地址,因此内存太多。谢谢,但我将保留此选项。如果您确实想优化查询,并且不关心所用内存和添加数字的复杂性,那么只需保留一个范围大小的数组即可。在每个单元格中保留应返回的值。通过这种方式可以得到O(1)查询,O(M)空间,其中M是范围长度,O(M)是插入时间。如果你做一个三元,它是O(log3n),4-树是O(log4n),依此类推。
        Dictionary<int, int> myDictionary = new Dictionary<int, int>();
        myDictionary.Add(3,1);
        myDictionary.Add(5,2);
        myDictionary.Add(10,3);

        //If you know the key exists, you can use
        int value = myDictionary[3];

        //If you don't know if the key is in the dictionary - use the TryGetValue method
        int value;
        if (myDictionary.TryGetValue(3, out value))
        {
            //The key was found and the corresponding value is stored in "value" 
        }