【问题标题】:Fuzzy NSDictionary - use nearest key模糊 NSDictionary - 使用最近的键
【发布时间】:2011-03-27 22:19:04
【问题描述】:

我有一个大约 4000 个数字的列表,例如:{10, 20, 30, 40, 50,...}

每个数字都是NSDictionary 中的一个键,因此我可以获取与数字关联的对象,例如

[NSDictionary objectForKey:[NSNumber numberWithInt:20];

但是,如果键不在字典中,我想找到最近的键(假设值之间存在有意义的关系,在我的示例中为 10>20>30 等)。

例如

[NSDictionary objectForKey:[NSNumberWithInt:19]] would return the value for key:20.

或者是否有其他更适合这样做的数据结构?我曾想过使用排序的 NSArray,其中键是数组索引,然后如果 object 为 null,则继续递增数组指针直到找到该对象,但这将导致一个包含 999,999 个元素的稀疏填充数组 :)

谢谢

【问题讨论】:

    标签: objective-c nsdictionary


    【解决方案1】:

    本质上,您需要保留键的排序列表 (NSMutableArray)。要查找键,请使用 NSArray 的 indexOfObject:inSortedRange:options:usingComparator: 方法传递 NSBinarySearchingInsertionIndex 作为选项,该选项将执行二进制搜索,即使找不到确切的元素,也会为您提供索引。您必须自己获取两个密钥并进行比较。

    【讨论】:

      【解决方案2】:

      假设您的数字列表按升序排列,您可以在数组中进行二分搜索。 因此,在查找键 x 时,您将从索引 array.length/2 开始,将该位置的键与 x 进行比较,如果大于 x 则继续左侧部分,如果小于 x 则继续右侧部分.继续,直到找到最接近 x 的键。

      这非常快(在您的情况下大约 log(4000) ~ 12 数组查找)并且不需要额外的存储空间。

      【讨论】:

        猜你喜欢
        • 2014-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-25
        • 2012-12-18
        • 1970-01-01
        • 2018-11-10
        相关资源
        最近更新 更多