StackOverflowError 什么时候被抛出?
When does StackOverflowError get thrown?
作业中出现的问题,可能是我的 potato 笔记本电脑造成的,但我感兴趣的是 Whosebug 何时会因不平衡的 BST(故意)而发生。
所以我正在比较搜索 AVL 树与不平衡 BST 的最差性能,搜索元素的相同方法适用于 AVL,但我得到 BST 的 Whosebug 错误。 BST 最终只是一个链表,"bad data" 被输入其中(字母名称;大约 10000),那么调用 entryExists 的次数是多少,它会产生该错误?
我知道不平衡的 BST 在最坏的情况下显然比 AVL 表现差得多,但我想限制搜索查询以获得某种时间数字。
[我不认为发布实际代码是必要的,但如果有人需要它,我会上传它 - 据我所知,不仅仅是我在做无限递归(两者都使用相同的方法).]
堆栈溢出发生在单个线程上的方法调用过多active(即进行中)的情况下。
每个方法调用都需要一个堆栈框架来保存调用的局部变量,以及一些调用内务信息。 (通常是 return 地址和保存的栈顶指针。)线程的堆栈帧保存在线程的堆栈中。这具有固定大小(在创建线程时确定)。默认值取决于 JVM 和命令行开关,但通常为 1Mbytes。
有四种情况会导致堆栈溢出:
- 无限递归肯定会导致堆栈溢出(除非其他东西先终止代码)。
- 太深的有限递归。例如,如果您的代码递归地遍历一个列表,如果列表足够长,它很可能会溢出堆栈。 (递归是不是无限的。)
- 复杂且涉及非常深的调用堆栈的非递归代码。
- 具有调用链的非递归代码涉及具有大量局部变量的方法。
情况 3 和 4 不太可能出现,但如果您的线程是使用异常小的线程堆栈创建的,则出现这种情况的可能性更大。 (例如,如果您正在尝试节省线程堆栈内存。)
就您而言,情况 2 是您的担忧。如果您的树已适当平衡,则不应发生这种情况。但是,如果一棵树极度不平衡,它可能会非常深。将其与递归(比如说)搜索树的算法相结合,足够深的树可能会导致堆栈溢出。
注意:这不是无限递归。相反,它是递归算法和数据结构的组合,不幸的是 "shape".
作业中出现的问题,可能是我的 potato 笔记本电脑造成的,但我感兴趣的是 Whosebug 何时会因不平衡的 BST(故意)而发生。
所以我正在比较搜索 AVL 树与不平衡 BST 的最差性能,搜索元素的相同方法适用于 AVL,但我得到 BST 的 Whosebug 错误。 BST 最终只是一个链表,"bad data" 被输入其中(字母名称;大约 10000),那么调用 entryExists 的次数是多少,它会产生该错误?
我知道不平衡的 BST 在最坏的情况下显然比 AVL 表现差得多,但我想限制搜索查询以获得某种时间数字。
[我不认为发布实际代码是必要的,但如果有人需要它,我会上传它 - 据我所知,不仅仅是我在做无限递归(两者都使用相同的方法).]
堆栈溢出发生在单个线程上的方法调用过多active(即进行中)的情况下。
每个方法调用都需要一个堆栈框架来保存调用的局部变量,以及一些调用内务信息。 (通常是 return 地址和保存的栈顶指针。)线程的堆栈帧保存在线程的堆栈中。这具有固定大小(在创建线程时确定)。默认值取决于 JVM 和命令行开关,但通常为 1Mbytes。
有四种情况会导致堆栈溢出:
- 无限递归肯定会导致堆栈溢出(除非其他东西先终止代码)。
- 太深的有限递归。例如,如果您的代码递归地遍历一个列表,如果列表足够长,它很可能会溢出堆栈。 (递归是不是无限的。)
- 复杂且涉及非常深的调用堆栈的非递归代码。
- 具有调用链的非递归代码涉及具有大量局部变量的方法。
情况 3 和 4 不太可能出现,但如果您的线程是使用异常小的线程堆栈创建的,则出现这种情况的可能性更大。 (例如,如果您正在尝试节省线程堆栈内存。)
就您而言,情况 2 是您的担忧。如果您的树已适当平衡,则不应发生这种情况。但是,如果一棵树极度不平衡,它可能会非常深。将其与递归(比如说)搜索树的算法相结合,足够深的树可能会导致堆栈溢出。
注意:这不是无限递归。相反,它是递归算法和数据结构的组合,不幸的是 "shape".