【问题标题】:Is it possible to use a hash table with a range of values?是否可以使用具有一系列值的哈希表?
【发布时间】:2014-03-22 23:55:10
【问题描述】:

情况:

  1. 我有一组 X(例如 10,000)个捕获的屏幕坐标。
  2. 屏幕上显示的是虚拟键盘。这呈现为相邻矩形控件的行(在本例中为边框控件)。
  3. 我想将每个屏幕坐标转换为在执行标准点击测试时它会点击的键,即坐标所在的键。
  4. 这需要尽可能高效地完成。

可能的解决方案:

  1. 生成一组键位置,其中包含每个键的屏幕坐标(LeftX、RightX、TopY、BottomY),并在屏幕键盘移动/调整大小时更新。
  2. 遍历我捕获的屏幕坐标并查找它与哪个键相关。

问题:

忽略并行执行循环的潜在收益,我想了解用于获取屏幕坐标并根据存储的键位置集执行匹配键查找的最佳结构和查找技术。

知道键盘上的键水平和垂直相邻,我可以使用它来优化查找,例如创建键行的哈希表并使用屏幕坐标的 Y 组件返回 null(坐标不在键盘上)或另一个表示该行中键的哈希表。然后我可以使用屏幕坐标的 X 组件进行类似的查找。

请记住,键通常不会与列对齐,因此我必须先查找一行,然后再查找一行中的键,而不是将屏幕坐标的 X 组件与列匹配,然后查找键入该列。

我怀疑使用标准 WPF 命中测试会非常低效,因为它会针对坐标下所有可能的视觉效果进行测试,而我只关心单个图层。

感谢您给我的任何帮助。这可能是微不足道的,但我不熟悉基于一系列值的哈希方法

【问题讨论】:

  • 我认为方法是错误的。将每个键盘键表示为一个矩形,执行Rectangle.Contains(point) 进行命中测试。该过程将迭代一个键的矩形数组并进行命中测试,直到通过命中测试或数组结束。您可以通过将大多数常用键矩形放入数组的开头来对其进行一些优化。
  • 你想达到什么目的?我可能遗漏了一些东西,但我想不出这种验证的任何目的,也许你不需要它!或者我遗漏了一些东西,在这种情况下,更多细节会有所帮助。
  • 我有一个屏幕键盘和一组外部捕获的屏幕坐标。我想将坐标转换为它们相交的一组键,以便我可以使用该信息进行进一步处理。我只是在想最好的方法。
  • @Sinatr 是的,但创建地图的目的是我可以优化该查找,而不是通过键(包括 Contains() 方法添加的任何开销)为每个坐标执行线性搜索.我正在尝试删除该线性搜索,因为它效率低下,因为我知道应该允许我优化它的布局。没有?

标签: c# wpf hash hashtable


【解决方案1】:

如果您使用索引,则可以进行最快的命中测试(因为它们的工作速度比其他任何东西都快)。

为键盘的每个键分配一个整数(例如,扫描码)。然后像这样创建一个点图

int[] map = new int[ymax * xmax]; // 1920*1200 = 2.304.000 (sizeof(int) * 2.3 Mb)

虽然它使用大量内存,但您可以使用它来映射其他事物。也可以先索引键(假设会有大约 100 个键,您可以使用 byte 数组代替保存键索引,但是您需要一个从索引到键的额外映射)。

地图告诉谁是像素的所有者。它可以是 0(没有人)或某人(键扫描码/键索引/对象索引)。

命中测试和测试一样难

return map[x + y * xmax];

但在您的情况下,我建议将关键边界表示为 Rectangle。虽然迭代 100 多个键(最差键)和 Rectangle.Contains(point) 需要时间,但该解决方案可能已经足够好(并且使用的内存很少)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 2015-11-27
    • 2022-07-06
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多