- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找一种方法来协调来自 3 个不同来源的元素。我已经将元素简化为只有一个键(字符串)和版本(长)。
列表是同时获得的(2 个来自单独的数据库查询,1 个来自另一个系统上的内存缓存)。
对于我的最终结果,我只关心所有 3 个源中版本不同的元素。所以我关心的结果将是一个 key 列表,每个系统中都有相应的版本。
Element1 | system1:v100 | system2:v100 | system3:v101 |
Element2 | system1:missing | system2:v200 | system3:v200 |
并且可以丢弃具有相同版本的元素。
我想到的两种实现方式是
等待所有数据源完成检索,然后循环遍历每个列表以聚合主列表,其中包含键的并集 + 所有 3 个版本(丢弃所有相同的项目)。
一旦完成第一个列表的检索,将其放入并发集合中,例如字典(在 .net 4.0 中提供),并在它们完成后立即开始聚合剩余列表(放入并发集合中)可用的。
我的想法是第二种方法会更快一些,但可能不会快很多。在所有 3 个来源都存在之前,我真的不能做太多事情,所以从第二种方法中获得的东西并不多,并且引入了争用。
也许有完全不同的方法来解决这个问题?此外,由于版本是使用 long 存储的,并且会有成百上千(可能是数百万)个元素,内存分配可能是一个问题(可能不是一个大问题,因为这些对象是短暂的)
最佳答案
HashSet 是一个选项,因为它具有 Union 和 Intersect 方法
要使用它,您必须覆盖 Equals 和 GetHashCode。
一个好的(唯一的)散列是性能的关键。
如果版本都是 v 那么 numeric 可以使用 numeric 来构建散列,缺失为 0。
有 Int32 可以玩,所以如果版本是 Int10 或更低可以创建一个完美的散列。
另一个选项是 ConcurrentDictionary(没有并发的 HashSet)并且将所有三个都输入其中。
仍然需要覆盖 Equals 和 GetHashCode。
我的直觉是三个 HashSet,然后 Union 会更快。
如果所有版本都是数字并且您可以使用 0 来表示缺失,那么可以打包成 UInt32 或 UInt64 并将其直接放入 HashSet 中。 Union 之后解压。使用位推 << 而不是数学来打包解包。
这只是两个 UInt16,但它在 2 秒内运行。
这将比散列类更快。
如果所有三个版本都很长,那么 HashSet <integral type>
不会是一个选项。
长 1 ^ 长 2 ^ 长 3;可能是一个很好的散列,但这不是我的专长。
我知道元组上的 GetHashCode 不好。
class Program
{
static void Main(string[] args)
{
HashSetComposite hsc1 = new HashSetComposite();
HashSetComposite hsc2 = new HashSetComposite();
for (UInt16 i = 0; i < 100; i++)
{
for (UInt16 j = 0; j < 40000; j++)
{
hsc1.Add(i, j);
}
for (UInt16 j = 20000; j < 60000; j++)
{
hsc2.Add(i, j);
}
}
Console.WriteLine(hsc1.Intersect(hsc2).Count().ToString());
Console.WriteLine(hsc1.Union(hsc2).Count().ToString());
}
}
public class HashSetComposite : HashSet<UInt32>
{
public void Add(UInt16 u1, UInt16 u2)
{
UInt32 unsignedKey = (((UInt32)u1) << 16) | u2;
Add(unsignedKey);
}
//left over notes from long
//ulong unsignedKey = (long) key;
//uint lowBits = (uint) (unsignedKey & 0xffffffffUL);
//uint highBits = (uint) (unsignedKey >> 32);
//int i1 = (int) highBits;
//int i2 = (int) lowBits;
}
使用 ConcurrentDictionary 进行测试,上面的速度是原来的两倍多。
锁定插入物是昂贵的。
关于c# - 协调 3 个列表的最佳算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12955126/
我想在包含点的主要方法中创建一个数组像 p={(3,8),(2,8)}与这个类 public class Point { private float x,y; public Point
在Elasticsearch中,建议将摄取节点设置为专用节点吗?我打算在k8s集群上运行Elasticsearch,并允许将提取容器安排在也运行其他Java服务容器的工作程序节点上。这是用于生产的良好
我最初的想法是使用管道来协调和控制多个C应用程序,并以shell脚本作为执行程序。假设一个 C 应用程序“A”执行 X,另一个 C 应用程序“B”执行 Y。shell 脚本通过 A 和 B 的 IPC
我在 json 文件中收集了推文集合。我想对它们进行操作,例如根据每个数据条目的时间和坐标对推文进行分组。目前,对于对象坐标,我将它们放在列表数据类型中。与时间和日期类似。所以我已经成功地解析了它们,
我有一个网页,用户应该可以在任何地方输入并跟踪他们的输入。一个问题是 firefox 中的斜线键“/”是打开搜索的快捷方式。这对我来说是不可取的。我还没有找到一种方法来捕获搜索功能并且仍然将输入添加到
我正在尝试使用 d3.dispatch 协调多个 View /控件和 Dispatching Events block 来指导我。然而,我遇到了概念上的障碍。考虑以下 View /控件: 国家/地区下
我在一台计算机上使用 Kaldi 工具集进行语音识别,但我无权修改 /var/kaldi 中的安装内容。该目录包含一个脚本文件夹,作为使用示例提供,这些脚本也彼此紧密链接。 结构如下,数据集mydat
在 C 中,“数组语法”只是指针语法的语法糖。那是a[4] 转换为 *(a+4)。 但这并不总是正确的。 当然下面是荒谬的, int a[4] = {1,2,3,4}; int *(a+4) =
我正在寻找一种方法来协调来自 3 个不同来源的元素。我已经将元素简化为只有一个键(字符串)和版本(长)。 列表是同时获得的(2 个来自单独的数据库查询,1 个来自另一个系统上的内存缓存)。 对于我的最
我开始了解 DDD,并担心从持久性中检索实体对象然后在 UI 的 View 模型中重构它们的性能影响。 假设我有两个聚合根: Person Orders ------ ------
我将 jQuery Flotchart 组件打包为 React 组件,每当组件属性发生更改时,我都需要调用图表实例的 plot 方法。 我最终得到的是 shouldComponentUpdate 钩子
如何在.plist中存储省份、城市和坐标信息?这些信息应该随我的应用程序一起提供。我尝试过以下格式,但不起作用。有没有其他方法可以替代plist?因为plist不利于查询。 ProvinceN
我一直在玩弄 SpriteKit,因为我想在一年内制作一款游戏,但最近我遇到了一些奇怪形式的减速带。 这就是问题所在。 我已经创建了一个常规的 SpriteKit 项目并更改了一些默认代码。我在位置
我有两个数组,在我的 C#/.NET Windows Forms 应用程序中使用 ChartDirector( http://www.advsofteng.com/product.html ) 将它们
我正在查看 article on wikipdia对于这个算法,我看到了两个看似矛盾的说法: "it also gives a deterministic way to check that the
我正在尝试将多个 CABasicAnimations 与 AVAudioPlayer 同步。我遇到的问题是 CABasicAnimation 在安排动画时使用 CACurrentMediaTime()
我们的项目正在使用 gitflow 详情 here我的问题是 QA 如何融入其中。 假设我有一个 master 分支和一个 hotfix 分支。一旦修补程序完成,我相信 QA 应该在修补程序发布时完成
有什么方法可以设置默认的 System.Web.Optimization.ScriptBundle 来生成 source maps对于捆绑和缩小的文件?除了必须在每次构建之前预先生成包和源映射之外,是
有什么方法可以设置默认的 System.Web.Optimization.ScriptBundle 来生成 source maps对于捆绑和缩小的文件?除了必须在每次构建之前预先生成包和源映射之外,是
更新到 Git 2.28 后,我意识到 conditional includes .但是,我无法找到一种方法来为 master(main) 设置不同的 pull reconciliation 选项,而
我是一名优秀的程序员,十分优秀!