最大 XOR 值比仅使用 XOR 更快

2024-01-01

给定一个数字 N 和一个整数数组(均不小于 2^15)。 (A 是数组大小 100000)
从数组中查找 N 和整数的最大异或值。

Q 是查询数量 (50000),start、stop 是数组中的范围。

Input:
A Q
a1 a2 a3 ...
N 启动停止

Output:
N 与数组中指定范围内的整数的最大异或值。

例如:输入
15 2(2 是查询数)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
10 6 10(查询1)
10 6 10(查询2)

Output:
13
13

Code:

for(int i=start-1;i<stop;i++){
int t =no[i]^a;
if(maxxor<t)
     maxxor=t;
}
cout << maxxor <<endl;

我需要一个比这个快 10-100 倍的算法。排序成本太高。我也尝试过二叉树、位操作。

2 倍 - 3 倍的改进怎么样?通过优化可以实现吗?


开发更快的算法是可能的。

我们将 N 的位称为:a[0]、a[1]、...、a[15],例如,如果 N = 13 = 0000000 00001101(二进制),则 a[0] = a[1] = 。 ..a[11] = 0、a[12] = 1、a[13] = 1、a[14] = 0、a[15] = 1。

算法的主要思想如下:如果a[0] == 1,那么最好的可能答案就是将该位清零。如果 a[0] == 0,则最佳可能答案在该位置有 1。 因此,首先检查是否有一些具有所需位的数字。如果是,您应该只使用该位的数字。如果不是,则取其倒数。 然后以同样的方式处理其他位。例如。如果a[0] == 1, a[1] == 0,首先检查是否有以0开头的数字,如果有则检查是否有以01开头的数字。如果没有以0开头的数字,那么你检查是否有以11开头的数字。依此类推...

因此,您需要一个快速算法来回答以下查询:在开始、停止范围内是否存在以位...开头的数字?

一种可能性:从数字的二进制表示构造特里树。在每个节点中存储该前缀在数组中的所有位置(并对它们进行排序)。然后可以简单地浏览这个特里树来回答这个查询。要检查开始、停止范围中是否有合适的前缀,您应该对节点中存储的数组进行二分搜索。

这可能导致算法复杂度为 O(lg^2 N),速度更快。

这是代码,尚未经过太多测试,可能包含错误:

#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

class TrieNode {
 public:
  TrieNode* next[2];
  vector<int> positions;

  TrieNode() {
    next[0] = next[1] = NULL;
  }

  bool HasNumberInRange(int start, int stop) {
    vector<int>::iterator it = lower_bound(
        positions.begin(), positions.end(), start);
    if (it == positions.end()) return false;
    return *it < stop;
  }
};

void AddNumberToTrie(int number, int index, TrieNode* base) {
  TrieNode* cur = base;
  // Go through all binary digits from most significant
  for (int i = 14; i >= 0; i--) {
    int digit = 0;
    if ((number & (1 << i)) != 0) digit = 1;
    cur->positions.push_back(index);
    if (cur->next[digit] == NULL) {
      cur->next[digit] = new TrieNode;
    }
    cur = cur->next[digit];
  }
  cur->positions.push_back(index);
}

int FindBestNumber(int a, int start, int stop, TrieNode* base) {
  int best_num = 0;
  TrieNode* cur = base;
  for (int i = 14; i >= 0; i--) {
    int digit = 1;
    if ((a & (1 << i)) != 0) digit = 0;
    if (cur->next[digit] == NULL || 
        !cur->next[digit]->HasNumberInRange(start, stop))
      digit = 1 - digit;
    best_num *= 2;
    best_num += digit;
    cur = cur->next[digit];
  }
  return best_num;
}


int main() {
  int n; scanf("%d", &n);
  int q; scanf("%d", &q);
  TrieNode base;
  for (int i = 0; i < n; i++) {
    int x; scanf("%d", &x);
    AddNumberToTrie(x, i, &base);
  }

  for (int i = 0; i < q; i++) {
    int a, start, stop;
    // Finds biggest i, such that start <= i < stop and XOR with a is as big as possible
    // Base index is 0
    scanf("%d %d %d", &a, &start, &stop);
    printf("%d\n", FindBestNumber(a, start, stop, &base)^a);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大 XOR 值比仅使用 XOR 更快 的相关文章

  • 在常数空间中创建 1..N 的随机排列

    我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 归并排序中递归树的高度log(n)+1是怎么来的

    我按照 stackoveflow 的建议阅读了一些问题和答案 我正在遵循 cormen 的 算法简介 一书进行自学 那本书里已经解释得很清楚了 但唯一没有解释的是如何在合并排序分析中计算树的高度 如果在后面的章节中对此进行解释的话 我仍然在
  • 在 O(n) 时间内排序?

    我被这个问题困扰了 2周 知道如何处理它吗 令 L 为 n 个不同整数的列表 假设 L 的 x 的元素在 1 750 范围内 设计线性排序算法对 L 的元素进行排序 我已经尝试过插入排序 但我不确定我的方法是否正确 Construct an
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • 用于开始和/或包含搜索的最快字符串集合结构/算法是什么

    我有以下情况 我有一个大的字符串集合 比如说 250 000 平均长度可能是 30 我要做的就是在这些搜索中进行许多搜索 大多数搜索都是 StartsWith 和 Contains 类型的 该集合在运行时是静态的 这意味着选择的集合的初始读
  • 在java中使用BUBBLE SORT对二维字符串数组进行排序

    类似的问题已经被问过 但从来没有关于二维字符串数组 因此在尝试了很长时间之后我找不到我想要的 我正在尝试使用 BubbleSort 对 java 中的 2D 字符串数组进行排序 作为输入 我收到一个二维字符串数组 一个表 以及您应该排序的
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • n 或 nlog(n) 比常数时间或对数时间更好吗?

    在 Coursera 上的普林斯顿教程中 讲师解释了遇到的常见增长顺序函数 他说 线性和线性算术运行时间是 我们努力的目标 他的推理是 随着输入大小的增加 运行时间也会增加 我认为这是他犯了错误的地方 因为我之前听过他提到线性增长顺序对于高
  • 需要解释搜索最小大和的算法

    我正在解决 Codility 问题作为练习 但无法回答其中一个问题 我在互联网上找到了答案 但我不明白这个算法是如何工作的 有人可以引导我逐步完成它吗 这是问题 You are given integers K M and a non em
  • 动态规划 (DP) 中的重叠子问题是什么?

    为了使动态规划适用 问题必须具有两个关键属性 最优子结构 and 重叠子问题 1 https en wikipedia org wiki Dynamic programming 对于这个问题 我们只关注后一个属性 有各种不同的定义重叠子问题
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • 如何使用 python 有效地找到两个大文件的交集?

    我有两个大文件 它们的内容如下所示 134430513125296589151963957125296589 该文件包含未排序的 id 列表 某些 id 可能会在单个文件中出现多次 现在我想找到路口两个文件的一部分 这就是两个文件中都出现的
  • 如何从 Trie 中检索给定长度的随机单词

    我有一个简单的 Trie 用来存储大约 80k 长度为 2 15 的单词 它非常适合检查字符串是否是单词 但是 现在我需要一种获取给定长度的随机单词的方法 换句话说 我需要 getRandomWord 5 来返回 5 个字母的单词 所有 5
  • 滚动或滑动窗口迭代器?

    我需要一个可在序列 迭代器 生成器上迭代的滚动窗口 又名滑动窗口 默认的 Python 迭代可以被视为一种特殊情况 其中窗口长度为 1 我当前正在使用以下代码 我怎样才能更优雅和 或更有效地做到这一点 def rolling window
  • 如何衡量字符串的复杂度?

    我有一些长字符串 1 000 000 个字符 每个字符串仅包含定义字母表中的符号 例如 A 1 2 3 示例字符串 string S1 1111111111 meta complexity 0 string S2 1111222333 me
  • 如何高效生成总和在指定范围内的所有组合(在所有深度)

    假设您有一组值 1 1 1 12 12 16 如何生成总和在预定义范围内的所有可能组合 不重复 min max 例如 这里是 所有深度的 范围在13 and 17 1 12 1 1 12 1 1 1 12 16 1 16 这假设具有相同值的
  • 如何提高洪水填充例程的性能?

    我正在我的应用程序中实现四路洪水填充 伪代码如下 Flood fill node target color replacement color 1 If the color of node is not equal to target co
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误

随机推荐

  • 如何从多个数据帧创建热图

    我对 R 还很陌生 并且一直困惑于如何从列表中的多个数据帧创建热图 每个数据框中有 3 列 X 位置 Y 位置 PatchStatus 第一个数据框如下所示 listofdfs lt list list of dataframes list
  • Flyway 无法连接到 docker-entrypoint-initdb.d 脚本中的 postgres 容器

    我正在尝试延长docker 的 postgres https hub docker com postgres 图像可能 通过环境变量标志 在 DB init 上执行 Flyway DB 迁移 我的 Dockerfile 在这里 FROM p
  • extjs,是否可以压缩加载ext-all.js?

    我有一个使用 extjs 库的网站 确切地说 我只需要网格 ajax 和树组件 我的项目是全国使用的 为了避免某些地区带宽低造成的问题 我必须让它尽可能的轻量 当我在chrome中使用开发者工具时 我的网站太重了 特别是在加载 ext al
  • Ruby:查找字符串中的前 N ​​个正则表达式匹配项(并停止扫描)

    想要扫描很长的字符串以查找正则表达式匹配 想知道找到前 N 个正则表达式的最有效方法是什么 例如就像是 abcabcabc scan b limit 2 如果仅扫描支持限制选项 则会在 5 个字符后成功结束 该字符串有几 MB 内存中的记忆
  • FTPWebRequest 530 错误:未登录问题

    我一直在挖掘大量关于如何在 C 中正确登录 FTP 的帖子 但当我真正尝试时 它不起作用 通过我的阅读 我开始认为这是因为我的用户名中有 at 符号 这是真的还是有其他问题 我可以使用 FileZilla 登录 没有问题 var file
  • 如何将nodejs从6.x更新到8.x?

    简单的问题 如何将nodejs从6 x更新到8 x 我有 Ubuntu 16 04 我应该卸载旧版本并安装新版本吗 如果是这样 我该怎么做 一个尝试过的 须藤最新 但它说 sudo n 未找到命令 当我刚刚 最新的 需要 sudo 卧槽 U
  • 有关 SQL Server 触发器的帮助

    假设我有3张桌子 t1 Nid name 1 aaa 2 bbb 3 ccc delT1 Nid name t2 Sid Nid value 1 1 AAA 2 1 BAC 3 2 CSA 表中t1 Nid是主键 是外键t2 现在我想要的是
  • 从 NSUrlConnection didReceiveAuthenticationChallenge 提供有意义的错误

    我正在使用 OWASP 示例证书和公钥固定 https www owasp org index php Certificate and Public Key Pinning 示例使用随机组织 http www random org and
  • 将 *.sdf 文件添加到 .gitignore 的可能影响

    我最近将一个 Visual Studio C 项目推送到了 github 我注意到 VS 创建了一个相对较大的 sdf 文件 25MB 我尝试删除工作区中的这个文件 看看 VS 是否会抛出错误 在 VS 中打开项目后 没有报告任何错误 并且
  • 我什么时候应该使用“类对象”、“类模块”、“模块内核”而不什么都不用?

    我是 ruby 元编程的新手 我看到人们在不同的地方对代码进行元编程 比如class Object class Module module Kernel和 无 即 在类 模块定义块之外 例如 我正在创建一个c attr accessor方法
  • 如何在dompdf中应用bootstrap样式

    我正在使用 bootstrap grid 来显示 我希望我的客户端以 pdf 格式下载它 因此我使用 dompdf 但 dompdf 无法应用 bootstrap 样式 我无法返回并将我的引导网格转换为基本的 html 表并使用不同的插件转
  • 出现错误 - ORA-01858: 在需要数字的地方发现了非数字字符

    我在下面的 sql 中收到错误 ORA 01858 在需要数字的地方发现了非数字字符 SELECT c contract num CASE WHEN MAX TO CHAR TO DATE c event dt YYYY MM DD MMD
  • 根据 Spark scala 中的文件夹名称重命名和移动 S3 文件

    我在 s3 文件夹中有 Spark 输出 我想将所有 s3 文件从该输出文件夹移动到另一个位置 但在移动时我想重命名这些文件 例如 我在 S3 文件夹中有文件 如下所示 现在我想重命名所有文件并放入另一个目录中 但文件的名称如下所示 Fun
  • 为什么 jQuery .insertAfter 在此示例中不起作用?

    在以下示例中 显示了警报 但 消息为空 If I 注释掉 insertAfter 行则 message 会正确显示 为什么 insertAfter 在此示例中不起作用 萤火虫径直跨过它 javascript google load jque
  • XWPF 表格单元格中的新段落

    我正在尝试创建一个包含一列的简单表格 我创建一个新行 并在每行中创建一个新段落 问题是每一行都以一个空行开头 我猜是新段落创建了它 我之前尝试设置间距 缩进等 但没有成功 for int i 0 i
  • 显示水平图像的列表框 WPF

    我正在尝试在 wpf xaml 中创建一个控件 它将显示图像的水平列表 列表框的宽度是固定的 无滚动条 添加新项目时 现有项目会减少显示的图像数量以容纳它 实际图像不仅仅减少显示的图像数量 该功能类似于向具有相对宽度属性 的网格添加新列 并
  • 如何将数据帧(从hive表获取)写入hadoop SequenceFile和RCFile?

    我可以把它写进 ORC PARQUET 直接和 TEXTFILE AVRO 使用来自 databricks 的附加依赖项
  • 使用 OpenCV 进行 gabor 边缘检测

    在 OpenCV 中 我检索用于图像处理的 Gabor 内核 它是一个 9 9 矩阵 使用 Imgproc getGaborKernel 我有原始图像的灰度矩阵 我什至不确定内核是否应该是图像的大小或只是一小段 我相当确定小内核 如何对两者
  • Telegram 机器人不适用于所有用户

    我创建了几个 Telegram 机器人 它们适用于我的帐户以及我测试过的其他几个帐户 但我收到一些用户的报告称机器人从未做出回应 是否有一些用户设置会阻止帐户从机器人获取消息 或者还有其他想法为什么它不适用于某些帐户 好的 找到问题了 是p
  • 最大 XOR 值比仅使用 XOR 更快

    给定一个数字 N 和一个整数数组 均不小于 2 15 A 是数组大小 100000 从数组中查找 N 和整数的最大异或值 Q 是查询数量 50000 start stop 是数组中的范围 Input A Qa1 a2 a3 N 启动停止 O