小编tem*_*def的帖子

计算线性时间的交集?

是否存在一个算法,给定两组,在线性时间内计算它们的交集?

我可以运行两个for循环来检查所有元素对,记录我在两个集合中找到的元素.但是,运行时间将为O(n 2).我如何在O(n)时间内完成此操作?

algorithm math big-o set-intersection data-structures

33
推荐指数
3
解决办法
4万
查看次数

给定一个数组,我可以在O(n)中找到最长范围,其端点是该范围内的最大值吗?

对于给定的整数数组,找到2个点(i和j)之间的最大距离,这些距离的值高于它们之间的任何元素.

例:

values: 0 10  8  9  6  7  4 10  0
index : 0  1  2  3  4  5  6  7  8 

对于上述值,解是i = 1,j = 7,但是

  • 如果索引7的值是9而不是10,则解是i = 3,j = 7
  • 如果索引7的值是7而不是10,则解是i = 5,j = 7

我无法在O(n)......任何人看到解决方案?

arrays algorithm math big-o

33
推荐指数
3
解决办法
5673
查看次数

支持O(1)随机访问和最坏情况O(1)的数据结构是否附加?

我意识到一个可调整大小的索引集合,它使用一个数组来存储它的元素(比如List<T>在.NET或ArrayListJava中),在集合的末尾分配了O(1)插入时间.但是在关键接合点处总是有一个令人讨厌的插入,其中集合刚刚达到其容量,并且下一次插入需要将内部阵列中的所有元素的完整副本转换为新的元素(可能是两倍大).

一个常见的错误(在我看来)是使用链表来"修复"这个问题; 但我相信为每个元素分配一个节点的开销可能非常浪费,事实上,在极少数情况下阵列插入成本很高的情况下,保证O(1)插入的好处相形见绌 - 事实上,其他每一个阵列插入明显更便宜(也更快).

我认为可能有意义的是一种混合方法,它由一个链接的数组列表组成,每当当前的"head"数组达到其容量时,一个两倍大的新数组被添加到链表中.然后,由于链表仍然具有原始数组,因此不需要复制.从本质上讲,这似乎与我相似(List<T>或者说是ArrayList方法),除了以前你曾经承担过复制内部数组所有元素的成本,这里你只需要分配数组和单个节点插入的成本.

当然,如果需要它们会使其他特征复杂化(例如,插入/移出集合的中间); 但正如我在标题中所表达的那样,我真的只是在寻找一个只添加(和迭代)的集合.

是否有适合此目的的数据结构?或者,你能想到一个吗?

language-agnostic arrays performance big-o data-structures

32
推荐指数
1
解决办法
4367
查看次数

是否有Fibonacci堆的标准Java实现?

我正在研究不同类型的堆数据结构.

Fibonacci堆似乎具有更好的最坏情况复杂度(1)插入,(2)删除和(2)找到最小元素.

我发现在Java中有一个类PriorityQueue是平衡的二进制堆.但为什么他们不使用Fibonacci堆?

另外,是否有斐波那契堆的实现java.util

谢谢!

java heap data-structures fibonacci-heap

32
推荐指数
2
解决办法
2万
查看次数

解构神奇宝贝故障?

(如果这是一个错误的地方,我很抱歉.我认为它肯定与编程相关,但如果这属于其他网站,请告诉我)

我一直在玩神奇宝贝红色和蓝色,这些游戏非常有趣,但因为有大量可利用的故障而臭名昭着(例如,看到这个使用内存损坏将项目屏幕变成十六进制编辑器的游戏的荒谬速度).

最近,我发现了一个有趣的游戏速度,使用一个名为"ZZAZZ故障"的小故障来破坏重要的记忆位置并让玩家几乎立即赢得比赛.根据作者对speedrun 的描述,ZZAZZ故障的工作原理如下:

要开始训练师之战,游戏需要加载大量数据,例如如果被击败他会承认的钱.当它加载钱时,事情会变得非常丑陋.由于超出我的原因,钱以完全不同的方式存储,游戏使用三个字节的数据结构,而不是将值转换为二进制,它将其存储在"人"表示中.例如,$ 123456将被存储为0x123456而不是0x01E240,即正确的转换.

[Trainer表中的某些无效条目]指向包含无效货币数据的位置.当游戏试图在所述结构中对这些数据进行算术运算时,它会疯狂并开始覆盖大部分RAM.更具体地说,对于每个三个字节的块,其中两个将包含0x9999(教练可以给出的最大金额).这种模式通过RAM重复多次.为了更好地看到这一点,我建议在面对ZZAZZ训练器后在模拟器上暂停视频并将VBA的内存查看器设置为0xD070.

这种分析是有道理的,但作为程序员,我不禁想知道程序员究竟是如何编写使这成为可能的代码的.如果输入不是有效的十六进制编码的十进制数,那么编写将十六进制编码的十进制数转换为十进制的函数的任何方法都不会开始用0x9999填充随机内存块.

我的问题是 - 没有专门设计算法以这种方式失败,是否有直接实现从十六进制编码的十进制到十进制的转换,当输入无效值时可能导致这种类型的内存损坏?

再说一次,如果这是偏离主题,我道歉.我的想法是,这个网站上的其他程序员也可能已经长大了玩这个游戏,这听起来像是一个有趣的逆向工程练习,试图弄清楚这样的故障怎么可能.

hex reverse-engineering decimal

32
推荐指数
3
解决办法
2377
查看次数

如何在C++中迭代无序集?

假设我有一个无序集

unordered_set<int> my_set;
myset.insert(1);
myset.insert(2);
myset.insert(3);
Run Code Online (Sandbox Code Playgroud)

我如何迭代它?我不需要以任何顺序迭代 - 只要我到达每个元素一次.我试过了

for (int i = 0; i < my_set.size(); i++)
     cout << my_set[i];
Run Code Online (Sandbox Code Playgroud)

无济于事.

c++ iteration unordered-set c++11

32
推荐指数
2
解决办法
5万
查看次数

在二叉搜索树上实现迭代器

最近我一直在编码了一堆不同的二叉搜索树实现(AVL,扇,树堆),并很好奇,如果有一个特别"好"的方式来写一个迭代器遍历这些结构.我现在使用的解决方案是让BST中的每个节点都存储指向树中下一个和前一个元素的指针,这会将迭代减少到标准的链表迭代.但是,我对这个答案并不满意.它通过两个指针(下一个和前一个)增加每个节点的空间使用量,在某种意义上它只是作弊.

我知道的构建,通过使用堆栈跟踪前沿节点的探索以后用0-1(H)的辅助存储空间(其中,h为树的高度),二叉搜索树迭代器的方式,但我由于内存的使用,我们拒绝对此进行编码.我希望有一些方法来构建一个只使用常量空间的迭代器.

我的问题是 - 有没有办法在具有以下属性的二叉搜索树上设计迭代器?

  1. 按升序访问元素(即按顺序遍历)
  2. next()hasNext()查询在O(1)时间内运行.
  3. 内存使用量为O(1)

为了更方便,它的罚款,如果你认为迭代(即没有插入,删除或旋转)在树形结构不改变形状,但如果有,确实可以处理这样的解决方案将是真的很酷.

algorithm iterator binary-search-tree

31
推荐指数
2
解决办法
5万
查看次数

在C++中评估数学表达式的最佳方法是什么?

例如,评估任何自定义数学表达式的最佳方法是什么

3+sqrt(5)+pow(3)+log(5)
Run Code Online (Sandbox Code Playgroud)

我知道将Python嵌入到C++中可以做到这一点; 有没有更好的方法?

谢谢!

c++ math expression

31
推荐指数
2
解决办法
2万
查看次数

改变一个整数

我们有一个整数

int x = 50;
Run Code Online (Sandbox Code Playgroud)

在二进制中,它是

00110010
Run Code Online (Sandbox Code Playgroud)

如何以编程方式更改第四(第4)位?

c c++ bit-manipulation bitwise-operators

31
推荐指数
3
解决办法
4万
查看次数

为什么不vector :: clear从向量中删除元素?

当我clear()在a上使用std::vector它时,它应该销毁它中的所有元素vector,而不是它.

示例代码:

vector<double> temp1(4);
cout << temp1.size() << std::endl;
temp1.clear();
cout << temp1.size() << std::endl;

temp1[2] = 343.5; // I should get segmentation fault here ....

cout << "Printing..... " << temp1[2] << endl;
cout << temp1.size() << std::endl;
Run Code Online (Sandbox Code Playgroud)

现在,我应该在尝试访问已清除的向量时遇到分段错误,但是它会填充那里的值(据我说这是非常错误的)

结果如下:

4
0
Printing..... 343.5
0
Run Code Online (Sandbox Code Playgroud)

这是正常的吗?这是一个非常难以发现的错误,它基本上杀了我的代码数月.

c++ stdvector undefined-behavior

31
推荐指数
5
解决办法
4310
查看次数