在恒定时间和线性空间中获取除一个以外的所有值?

时间:2015-07-22 04:17:42

标签: c# .net algorithm data-structures

我有数千个Entry个对象,并且有一个方法GetAllExcept(int entryId),它返回除{1}之外的所有对象,但指定了一个键。此方法将被多次调用,因此应针对读取进行优化。我也有内存限制因此线性空间复杂度更好。

我每次都可以遍历对象列表,但它会在List<Entry>时间内。 我可以预处理以使用O(n)将entryId映射到Dictionary<int, List<Entry>> List但没有该密钥但Entries空间复杂度。{/ p>

任何人都有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

我不知道Entry对象,与List<Entry>对象的大小相比,调用的时间。因此,您必须确认我的建议是否适用于您的情况。

让我演示一种使用整数的技术,您可以将其应用于Entry对象。我假设你有一个List,其中EntryId是一个整数。让我们说你的List<EntryId>有数千个元素,你需要拨打GetAllExcept(int entryId)一百万次。

您应该将ListId的集合存储在略有不同的数据结构中。想象一下一个排序列表,它被分解成合理大小(适合缓存行)的块,每个块放在一个桶中;类似于锯齿状数组EntryId[][]List<List<EntryId>>

因此,即使您仍然具有O(n)性能,您也会将乘数的值减少很多。这种数据结构可以更好地处理分支预测器和处理器缓存。

答案 1 :(得分:0)

您可以保留两个列表,一个大小为if (viewController is Trove.HomeViewController) { let alertController = UIAlertController(title: "Logout", message: "Are you sure you want to log out?", preferredStyle: .Alert) let okAction = UIAlertAction(title: "Logout", style: .Default) { (action) in tabBarController.selectedIndex = 0 //CHANGE ME } alertController.addAction(okAction) let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in } alertController.addAction(cancelAction) tabBarController.presentViewController(alertController, animated: true) return false } ,一个大小为N。此外,请跟踪较小列表中缺少的项目。

当系统要求您提供不同的“除一个”列表时,请将较小列表中缺少的项目与您要求排除的项目交换。

Voila,O(1)时间和O(n)空间要求。 (O(n)时间内的初始设置除外,但仍应导致O(1)摊销时间。)

但是,它并不那么容易。您必须在O(1)时间内找到要从较小列表中删除的项目,并且知道较大列表中的索引是不够的,因为小列表会被这一系列替换进行洗牌。所以你需要一个额外的数组映射全局索引到小列表索引。维护此列表具有相同的复杂性:O(n)空间,O(1)更新,O(n)设置时间。

消费者还需要承诺不会覆盖小列表,因此您可以将其重复用于下一次调用。当然,后续调用DOES会覆盖小列表,因此消费者必须立即使用该列表;他不被允许保存以备将来使用。当然,从N-1返回的列表具有正确的对象集,但不是原始顺序。