我有数千个Entry
个对象,并且有一个方法GetAllExcept(int entryId)
,它返回除{1}之外的所有对象,但指定了一个键。此方法将被多次调用,因此应针对读取进行优化。我也有内存限制因此线性空间复杂度更好。
我每次都可以遍历对象列表,但它会在List<Entry>
时间内。
我可以预处理以使用O(n)
将entryId映射到Dictionary<int, List<Entry>>
List
但没有该密钥但Entries
空间复杂度。{/ p>
任何人都有更好的解决方案吗?
答案 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
返回的列表具有正确的对象集,但不是原始顺序。