什么时候抛出StackOverflowError?

时间:2017-04-22 12:42:57

标签: java binary-search-tree avl-tree

在作业中出现的东西,可能是由于我的马铃薯笔记本电脑,但我对StackOverflow何时发生不平衡的BST(故意)感兴趣。

所以我正在比较搜索AVL树与不平衡BST的最差性能,并且搜索元素的方法与AVL相同,但我得到BST的StackOverflow错误。 BST最终只是一个链接列表,其中包含“坏数据”(字母名称;大约10000),那么对entryExists的调用次数是否会产生错误?

我知道不平衡的BST在最坏的情况下显然比AVL差得多,但我想限制搜索查询以获取某种时间数。

[我不认为发布实际代码是必要的,但如果有人需要它,我会上传它 - 据我所知,这不仅仅是我做无限递归(两者都使用相同的方法)。 ]

1 个答案:

答案 0 :(得分:2)

在单个线程上有太多方法调用 active (即正在进行中)的情况下发生堆栈溢出。

每个方法调用都需要一个堆栈帧来保存调用的局部变量,以及一些调用内务信息。 (通常是返回地址,以及保存的堆栈顶部指针。)线程的堆栈帧保存在线程的堆栈中。这具有固定大小(在创建线程时确定)。默认值取决于JVM和命令行开关,但通常为1Mbytes。

有四种情况可能导致堆栈溢出:

  1. 无限递归可以保证导致堆栈溢出(除非其他东西首先终止代码)。
  2. 有限递归太深。例如,如果您的代码以递归方式遍历列表,那么很可能溢出堆栈的列表足够长。 (递归无限。)
  3. 非递归代码,复杂且涉及非常深的调用堆栈。
  4. 带有调用链的非递归代码,涉及具有大量局部变量的方法。
  5. 方案3和4不太可能,但如果您的线程是使用异常小的线程堆栈创建的,则它们更有可能发生。 (例如,如果您试图节省线程堆栈内存。)

    在您的情况下,方案2是您的担忧。如果您的树正确平衡,则不应该发生这种情况。但是,如果一棵树非常不平衡,它可能会非常深。将其与递归(例如)搜索树的算法相结合,并且足够深的树可能导致堆栈溢出。

    注意:这不是无限递归。相反,它是递归算法和具有不幸“形状”的数据结构的组合。