- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定一个数字 N 和一个整数数组(所有整数都小于 2^15)。 (A 是数组 100000 的大小)
从数组中找到 N 和整数的最大 XOR 值。
Q是查询次数(50000)和开始,停止是数组中的范围。
输入:
问
a1 a2 a3 ...
N 开始停止
输出:
N的最大XOR值与数组中指定范围内的整数。
例如:输入
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)
输出:
13
13
代码:
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,则最佳可能答案在此位置有一个。所以首先你检查你是否有一些具有所需位的数字。如果是,你应该只用这个位取数字。如果不是,则取反。然后您以相同的方式处理其他位。例如。 if a[0] == 1, a[1] == 0,首先检查是否有以0开头的数字,如果有则检查是否有以01开头的数字。如果没有以0开头的数字,那么你检查是否有11开头的数字,以此类推...
所以你需要一个快速的算法来回答以下查询:是否有一个以位开头的数字...在范围开始,停止?
一种可能性:从数字的二进制表示构造 trie。在每个节点中存储此前缀在数组中的所有位置(并对它们进行排序)。然后回答这个查询可以简单地遍历这个 trie。要检查开始、结束范围内是否有合适的前缀,您应该对节点中存储的数组进行二分查找。
这可能导致复杂度为 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);
}
}
关于algorithm - 最大 XOR 值比仅使用 XOR 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10734334/
XOR 的各个部分如何命名? A xor B = C A和B叫什么 对于分部,它是: A / B = C A = 除数,B = 被除数,C = 商 对于和(和 XOR 与和一样对称)它是 A + B
我在算法方面遇到了问题。 我有一个用于 IO 的字节,可以使用称为 XorAndXor 的方法设置其中的某些位。该算法的工作原理如下: newValue = (((currentValue XOR x
我很惊讶地看到一个 BPMN 图,其中一个异或决策(“XOR-Split”)用相同的网关符号“关闭”。 我真的想知道证明这种方法合理的原因是什么。在我看来,这是多余的。 事实似乎是,XOR-Join
我在查看 XOR 链接列表的实现时多次遇到这段代码,但似乎没有一个人正确解释了这一行(或者也许我错过了一些东西) - struct node* XOR (struct node *a, struct
这应该是一个简单的问题。我是 Coq 的新手。 我想在 Coq 中定义exclusive or in Coq(据我所知,这不是预定义的)。重要的部分是允许多个命题(例如 Xor A B C D)。 我
我试图记住数学是如何计算出来的,以计算循环冗余检查中 XOR 算法的剩余部分,以验证网络消息的剩余位。 我不应该扔掉那本教科书。 这在代码中很容易完成,但是如何手工完成呢? 我知道它看起来有点像标准除
给定一个数字 N 和一个整数数组(所有整数都小于 2^15)。 (A 是数组 100000 的大小) 从数组中找到 N 和整数的最大 XOR 值。 Q是查询次数(50000)和开始,停止是数组中的范围
这更像是一个有趣的问题。我正在研究 SC61860 CPU,它是 8 位 CPU,用于 1987 年的 Sharp PC-1360 掌上电脑(也用于 PC-1401 和 1403)。它的指令集实际上并
我正在尝试在 c 中进行某种异或文件加密,并在 javascript 中进行解密(使用 this 作为基础,现在我遇到了以下问题: 例如我想在 C 中执行 73^122,结果是 57,但在 javas
我的任务是计算数组中字节的异或和: X = char1 XOR char2 XOR char3 ... charN; 我正在尝试将其并行化,改为对 __m128 进行异或运算。这应该提供加速因子 4。
我有一系列错误或 View ( Seq[Xor[Error,View]] ) 我想将其映射到第一个错误(如果有)或 View 序列的异或 ( Xor[Error, Seq[View]] ) 或者可能只
这是我想做的一个例子:假设我有 5 个类,我想表达这样的约束,即我们可以将类“B”或/和“C”的实例链接到“A”,如果是这样,我们就不能拥有其他任何东西,如果我们不这样做没有这些类的任何实例,我们只能
因此我们可以确定异或距离度量是一个真实的度量(它是对称的,满足三角不等式等) 在阅读 Kademlia 及其 k-buckets 之前,我在想每个节点都会简单地找到自己的 id 并存储其最近的 k 个
该函数用于计算一个32位整数的异或 int xor32int(int x, int y) { int res = 0; // Initialize result // Assuming
我是加密新手,我正在尝试解释以下代码。即, 是什么?什么意思? 我有一个 secret_key key 。我也有一个 unique_id。我使用下面的代码创建垫。 pad = hmac.new(sec
我正在尝试将一些 javascript 代码复制到 python 中,由于某种原因,javascript 中的 XOR 运算符 (^) 给我的值与 python 中的 XOR 运算符 (^) 不同。我
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
这个问题在这里已经有了答案: Does Typescript support mutually exclusive types? (7 个答案) 关闭 3 年前。 我怎么说我希望一个接口(inter
我有一些未知的 C++ 代码是在发布版本中编译的,因此对其进行了优化。我正在努力解决的问题是: xor al, al add esp, 8 cmp byte ptr [ebp+
我得到了以下卡诺图,但我仍然无法从每个表中计算 XOR 的表达式。 Table 1 -------
我是一名优秀的程序员,十分优秀!