堆栈溢出?非常深的递归期间的有趣行为
Stack overflow? Interesting behaviour during very deep recursion
当我在 BST、Linked Lists 和 AVL 上做作业时,我注意到..实际上它如标题所示。
我相信它与堆栈溢出有某种关系,但找不到它发生的原因。
创建 BST 和链表
正在搜索链表和 BST 中的所有元素
可能是最有趣的...
BST与AVL的高度对比
(基于唯一随机整数数组)
在每张图上,一些有趣的事情从大约 33k 个元素开始。
MS 中的优化 O2 Visual Studio 2019 社区。
链表的查找功能不是递归的。
每个 "link" 的内存是用 "new" 运算符分配的。
X 轴在 40k 元素处结束,因为当它大约为 43k 时会发生堆栈溢出错误。
你知道为什么会这样吗?实际上,我很好奇发生了什么。期待您的回答!保持健康。
这是一些相关的代码,虽然不完全相同,但我可以保证它的工作原理是一样的,可以说一些代码是基于它的。
struct tree {
tree() {
info = NULL;
left = NULL;
right = NULL;
}
int info;
struct tree *left;
struct tree *right;
};
struct tree *insert(struct tree*& root, int x) {
if(!root) {
root= new tree;
root->info = x;
root->left = NULL;
root->right = NULL;
return(root);
}
if(root->info > x)
root->left = insert(root->left,x); else {
if(root->info < x)
root->right = insert(root->right,x);
}
return(root);
}
struct tree *search(struct tree*& root, int x) {
struct tree *ptr;
ptr=root;
while(ptr) {
if(x>ptr->info)
ptr=ptr->right; else if(x<ptr->info)
ptr=ptr->left; else
return ptr;
}
int bstHeight(tree*& tr) {
if (tr == NULL) {
return -1;
}
int lefth = bstHeight(tr->left);
int righth = bstHeight(tr->right);
if (lefth > righth) {
return lefth + 1;
} else {
return righth + 1;
}
}
AVL树是按顺序读取的BST,然后通过二分法将元素数组插入到树object中。
时间可能会出现峰值,我几乎可以肯定它们是,因为用完了 CPU(例如 L2)的一些缓存。一些剩余数据存储在较慢的内存中。
回答感谢@David_Schwartz
BST树的高度飙升实际上是我自己的错。对于 "array of unique random" 整数,我使用了已经排序的唯一项目的数组,然后通过使用 rand()
函数交换元素将它们混合起来。我完全忘记了如果期望随机更大的数字会有多大的破坏性。
感谢@rici 指出。
当我在 BST、Linked Lists 和 AVL 上做作业时,我注意到..实际上它如标题所示。
我相信它与堆栈溢出有某种关系,但找不到它发生的原因。
创建 BST 和链表
正在搜索链表和 BST 中的所有元素
BST与AVL的高度对比
(基于唯一随机整数数组)
在每张图上,一些有趣的事情从大约 33k 个元素开始。
MS 中的优化 O2 Visual Studio 2019 社区。
链表的查找功能不是递归的。
每个 "link" 的内存是用 "new" 运算符分配的。
X 轴在 40k 元素处结束,因为当它大约为 43k 时会发生堆栈溢出错误。
你知道为什么会这样吗?实际上,我很好奇发生了什么。期待您的回答!保持健康。
这是一些相关的代码,虽然不完全相同,但我可以保证它的工作原理是一样的,可以说一些代码是基于它的。
struct tree {
tree() {
info = NULL;
left = NULL;
right = NULL;
}
int info;
struct tree *left;
struct tree *right;
};
struct tree *insert(struct tree*& root, int x) {
if(!root) {
root= new tree;
root->info = x;
root->left = NULL;
root->right = NULL;
return(root);
}
if(root->info > x)
root->left = insert(root->left,x); else {
if(root->info < x)
root->right = insert(root->right,x);
}
return(root);
}
struct tree *search(struct tree*& root, int x) {
struct tree *ptr;
ptr=root;
while(ptr) {
if(x>ptr->info)
ptr=ptr->right; else if(x<ptr->info)
ptr=ptr->left; else
return ptr;
}
int bstHeight(tree*& tr) {
if (tr == NULL) {
return -1;
}
int lefth = bstHeight(tr->left);
int righth = bstHeight(tr->right);
if (lefth > righth) {
return lefth + 1;
} else {
return righth + 1;
}
}
AVL树是按顺序读取的BST,然后通过二分法将元素数组插入到树object中。
时间可能会出现峰值,我几乎可以肯定它们是,因为用完了 CPU(例如 L2)的一些缓存。一些剩余数据存储在较慢的内存中。
回答感谢@David_Schwartz
BST树的高度飙升实际上是我自己的错。对于 "array of unique random" 整数,我使用了已经排序的唯一项目的数组,然后通过使用 rand()
函数交换元素将它们混合起来。我完全忘记了如果期望随机更大的数字会有多大的破坏性。
感谢@rici 指出。