汉明立方体顶点上的查询点

2024-04-09

我有 N 个点,仅位于 D 维立方体的顶点上,其中 D 约为 3。

A vertex may not contain any point. So every point has coordinates in {0, 1}D. I am only interested in query time, as long as the memory cost is reasonable ( not exponential in N for example :) ).

给定一个位于立方体顶点之一的查询和一个输入参数r,找到所有具有以下特征的顶点(即点)汉明距离 <= r与查询。

走什么路c++ /questions/tagged/c%2b%2b环境?


我正在考虑 kd 树,但我不确定并需要帮助,任何输入,即使是近似的,将不胜感激!自从汉明距离发挥作用时,按位操作应该会有所帮助(例如 XOR)。


有一个很好的 Bithack 可以从一个位掩码开始k位设置为按字典顺序排列的下一个排列 https://graphics.stanford.edu/~seander/bithacks.html#NextBitPermutation,这意味着循环所有蒙版相当简单k位设置。将这些掩码与初始值进行异或运算,准确给出汉明距离处的所有值k远离它。

So for D尺寸,其中D小于 32(否则更改类型),

uint32_t limit = (1u << D) - 1;
for (int k = 1; k <= r; k++) {
    uint32_t diff = (1u << k) - 1;
    while (diff <= limit) {
        // v is the input vertex
        uint32_t vertex = v ^ diff;
        // use it
        diff = nextBitPermutation(diff);
    }
}

Where nextBitPermutation可以在 C++ 中实现为类似的东西(如果你有__builtin_ctz)

uint32_t nextBitPermutation(uint32_t v) {
    // see https://graphics.stanford.edu/~seander/bithacks.html#NextBitPermutation
    uint32_t t = v | (v - 1);
    return (t + 1) | (((~t & -~t) - 1) >> (__builtin_ctz(v) + 1));
}

或者对于 MSVC(未测试)

uint32_t nextBitPermutation(uint32_t v) {
    // see https://graphics.stanford.edu/~seander/bithacks.html#NextBitPermutation
    uint32_t t = v | (v - 1);
    unsigned long tzc;
    _BitScanForward(&tzc, v); // v != 0 so the return value doesn't matter
    return (t + 1) | (((~t & -~t) - 1) >> (tzc + 1));
}

If D is really低、4或更低、旧popcnt-with-pshufb效果非常好,通常一切都排列得很好,如下所示:

uint16_t query(int vertex, int r, int8_t* validmask)
{
    // validmask should be array of 16 int8_t's,
    // 0 for a vertex that doesn't exist, -1 if it does
    __m128i valid = _mm_loadu_si128((__m128i*)validmask);
    __m128i t0 = _mm_set1_epi8(vertex);
    __m128i r0 = _mm_set1_epi8(r + 1);
    __m128i all =        _mm_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
    __m128i popcnt_lut = _mm_setr_epi8(0, 1, 1, 2, 1, 2, 2, 3, 1, 2,  2,  3,  2,  3,  3,  4);
    __m128i dist = _mm_shuffle_epi8(popcnt_lut, _mm_xor_si128(t0, all));
    __m128i close_enough = _mm_cmpgt_epi8(r0, dist);
    __m128i result = _mm_and_si128(close_enough, valid);
    return _mm_movemask_epi8(result);
}

这应该相当快;与上面的 bithack 相比更快(nextBitPermutation,相当重,在那里被大量使用),并且还与循环所有顶点并测试它们是否在范围内(即使使用内置popcnt,这自动需要至少 16 个周期,而上面的应该不需要,假设所有内容都被缓存,甚至永久地存储在寄存器中)。缺点是结果使用起来很烦人,因为它是哪些顶点既存在又在查询点范围内的掩码,而不是它们的列表。不过,它可以很好地结合对与点相关的数据进行一些处理。

当然,这也会缩小到 D=3,只要使 >= 8 的点都不有效即可。 D>4 可以类似地完成,但需要更多代码,而且由于这实际上是一个强力解决方案,仅由于并行性而速度很快,因此从根本上来说,D 中的速度会呈指数级下降。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汉明立方体顶点上的查询点 的相关文章

  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 在常数空间中创建 1..N 的随机排列

    我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用

随机推荐

  • 带有时态表的 Entity Framework Core 3.1 - 访问 SysStartTime 和 SysEndTime

    我已经基于 Microsoft SQL 文档创建了时态表使用默认历史表创建临时表 https learn microsoft com en us sql relational databases tables creating a syst
  • 将 Pylons 控制器作为单独的应用程序运行?

    我有一个 Pylons 应用程序 我想将一些逻辑移动到单独的批处理过程中 我一直在主应用程序下运行它进行测试 但它将在数据库中执行大量工作 我希望它是一个单独的进程 将在后台不断运行 主 pylons 应用程序会将作业提交到数据库中 新进程
  • 如何在 android 中构建支持旧 SDK 版本 (minSdkVersion) 的应用程序

    当通过向导创建新项目并给出错误时 那就太沮丧了 我只是使用 MinSdk 9 创建新项目以使应用程序在姜饼上运行 这给了我以下错误 Error Execution failed for task app processDebugManife
  • 如何让 Discord 机器人异步等待多条消息的反应?

    tl dr 我的机器人如何异步等待多条消息的反应 我正在向我的 Discord 机器人添加石头剪刀布 rps 命令 用户可以通过输入调用命令 rps以及一个可选参数 指定要玩的用户 rps TrebledJ 被调用时 机器人将直接向调用它的
  • nextjs 动态路由渲染内容不起作用

    我被这个问题困扰了很多天 我在用Next js https nextjs org 并有 3 页 页面 index js 页面 categories js 页面 类别 slug js The categories slug js正在使用Nex
  • 从 Hudson 运行 DUnit 测试

    我终于让 Hudson 构建了我的项目和相应的测试项目 使用 Embarcadero 论坛中提供的 XMLTestRunner2 单元 手动正确运行测试可执行文件会生成包含测试结果的 dunit report xml 文件 但我无法让 Hu
  • HashSet.contains 在不应该返回 false 时返回 false

    我有这个代码 public class Tray private Set
  • 将 Java 集合转换为 Scala 集合

    与堆栈溢出问题相关Scala 相当于 new HashSet Collection https stackoverflow com questions 674545 如何转换 Java 集合 java util List比如说 到 Scal
  • XSLT 身份转换

    我正在测试 XSLT 身份转换 因此我随机选择了 www w3schools com 上的以下示例 因为它允许我在线尝试 我将右侧窗格中的 XSLT 更改为身份转换
  • 毕加索库,Android:使用错误侦听器

    我正在使用毕加索库来加载图像 但遇到了一个问题 当图像加载失败时 我想隐藏视图而不是加载默认图像 我从源代码中注意到 添加侦听器的唯一方法似乎是来自构建器 但是当图像加载失败时 永远不会调用错误方法 有人对此有经验吗 iv ImageVie
  • Android imageview 从缩放图像中获取像素颜色

    我的家庭自动化应用程序有一个功能 人们可以将图像上传到手机 其中包含平面图和仪表板 他们可以使用它们来控制家庭自动化软件 我让他们上传两张图像 一张可见图像 其中包含他们想要显示的图形 第二张彩色图 其纯色对应于他们想要从可见图像中定位的区
  • 在opengl中,如何获得像素和gl.gltranslatef(floatx,y,z)之间的关系?

    我正在尝试在 Android 上学习 opengl 的东西 在 gl gltranslatef x y z 调用中 我将纹理沿 ve x 方向移动一些单位 但我无法找到 1 个 x 单位所属的像素数 这是我正在做的事情 我调用 gl glv
  • Simba Athena ODBC:无法使用 SQLGetPrivateProfileString 函数

    这很奇怪 我想设置从 RStudio 到我在 AWS Athena 中的实例的连接 我在用unixodbc作为驱动程序管理器 并通过使用测试连接成功isql v Simba Athena 但是 当我在 RStudio 中测试连接时 con
  • deviceready 事件未在 Angular 混合应用程序中触发

    我正在构建一个全平台 Angular 6 应用程序 该应用程序将用 Cordova 8 1 2 包装 不幸的是我无法制作设备就绪触发事件 我有两个独立的项目 一个用于 Angular 一个用于 Cordova 我可以使用以下命令构建 Ang
  • MySQL 通过在非索引列上执行删除语句时锁定整个表来尝试防止什么现象

    使用可重复读的 MySQL 隔离级别 给定表test具有非索引列quantity id quantity 1 10 2 20 3 30 Tx1执行第一个 注意它还没有提交 这意味着所有获取的锁还没有释放 Tx1 START TRANSACT
  • 如何使用PHP获取用户的屏幕分辨率[重复]

    这个问题在这里已经有答案了 可能的重复 使用PHP获取屏幕分辨率 https stackoverflow com questions 1504459 getting the screen resolution using php 这个问题是
  • 通过 JS 调用 JSF 方法 [重复]

    这个问题在这里已经有答案了 我在 JS 代码中有一个 for 循环 我想调用一个方法 该方法的参数写在 JAVA 托管 bean 中 该方法计算一个值并返回一个将在 JS 中使用的新值 注意 我在 xhtml 页面中使用 primeface
  • QML ListView 如何估计其 contentItem 的高度/宽度

    我想知道如何ListView估计它的高度 宽度contentItem 尽管代表是Component您无法询问 并且不同委托实例的大小可能有所不同 它不使用当前实例的平均大小 否则在实施例1 如果按下一个元素 则估计大小将为3055 5如果计
  • FreeBSD 中的多行删除

    我们怎样才能在 FreeBSD 中实现这一点呢 FreeBSD 中包含模式的多行删除块 sed START TAG a N END TAG ba ID 222 d data txt See sed 多行删除与模式 https stackov
  • 汉明立方体顶点上的查询点

    我有 N 个点 仅位于 D 维立方体的顶点上 其中 D 约为 3 A vertex may not contain any point So every point has coordinates in 0 1 D I am only in