Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java StackOverflowerr什么时候被抛出?_Java_Binary Search Tree_Avl Tree - Fatal编程技术网

Java StackOverflowerr什么时候被抛出?

Java StackOverflowerr什么时候被抛出?,java,binary-search-tree,avl-tree,Java,Binary Search Tree,Avl Tree,作业中出现了一些问题,可能是因为我的马铃薯笔记本电脑,但我感兴趣的是,不平衡的BST(故意)何时会发生堆栈溢出 因此,我比较了搜索AVL树和不平衡BST的最差性能,搜索元素的方法同样适用于AVL,但我得到了BST的StackOverflow错误。BST最终只是一个链表,其中包含“坏数据”(按字母顺序排列的名称;大约10000个),那么对entryExists的调用次数是多少呢 我知道在最坏的情况下,非平衡BST的性能明显比AVL差得多,但我想限制搜索查询以获取某种时间编号 [我不认为发布实际代码

作业中出现了一些问题,可能是因为我的马铃薯笔记本电脑,但我感兴趣的是,不平衡的BST(故意)何时会发生堆栈溢出

因此,我比较了搜索AVL树和不平衡BST的最差性能,搜索元素的方法同样适用于AVL,但我得到了BST的StackOverflow错误。BST最终只是一个链表,其中包含“坏数据”(按字母顺序排列的名称;大约10000个),那么对entryExists的调用次数是多少呢

我知道在最坏的情况下,非平衡BST的性能明显比AVL差得多,但我想限制搜索查询以获取某种时间编号


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

如果单个线程上有太多的方法调用处于活动状态(即正在进行中),则会发生堆栈溢出

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

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

  • 无限递归保证会导致堆栈溢出(除非其他东西先终止代码)
  • 太深的有限递归。例如,如果您的代码递归地遍历一个列表,当列表足够长时,它很可能会溢出堆栈。(递归不是无限的。)
  • 非常复杂且涉及非常深的调用堆栈的非递归代码
  • 具有包含大量局部变量的方法的调用链的非递归代码
  • 场景3和场景4不太可能,但如果您的线程是使用非常小的线程堆栈创建的,则更可能出现这种情况。(例如,如果您试图节约线程堆栈内存。)


    在您的情况下,场景2是您的担忧。这不应该发生,如果你的树是适当的平衡。然而,如果一棵树非常不平衡,它可能非常深。将其与递归(比如)搜索树的算法相结合,足够深的树可能导致堆栈溢出


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

    如果单个线程上有太多的方法调用处于活动状态(即正在进行中),则会发生堆栈溢出

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

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

  • 无限递归保证会导致堆栈溢出(除非其他东西先终止代码)
  • 太深的有限递归。例如,如果您的代码递归地遍历一个列表,当列表足够长时,它很可能会溢出堆栈。(递归不是无限的。)
  • 非常复杂且涉及非常深的调用堆栈的非递归代码
  • 具有包含大量局部变量的方法的调用链的非递归代码
  • 场景3和场景4不太可能,但如果您的线程是使用非常小的线程堆栈创建的,则更可能出现这种情况。(例如,如果您试图节约线程堆栈内存。)


    在您的情况下,场景2是您的担忧。这不应该发生,如果你的树是适当的平衡。然而,如果一棵树非常不平衡,它可能非常深。将其与递归(比如)搜索树的算法相结合,足够深的树可能导致堆栈溢出


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

    当代码不断调用自身时,它会被抛出,就像当一个方法再次调用自身时一样。最有可能的是,您在代码执行的某个递归中弄乱了返回条件。在这个网站上,stackoverflow异常显示为downvotes,因为人们认为您之前没有做过任何研究,例如,在搜索引擎中输入异常名称,它的右边是@StephenC,我的错!但不幸的是,我现在无法编辑它。因此,我删除并再次发布评论。感谢您纠正我的错误。StackOverflowerError是一种情况,因为在您的程序中发生了无限多的方法调用。所谓无限,我指的是超过方法调用堆栈允许的大小。这种情况主要发生在以递归方式实现算法时,并且初始条件没有正确实现以停止自调用。如果正确实现了算法,可以增加堆栈大小以支持所需的递归调用数。在这里,您可以了解它是如何被抛出的:当您的代码不断调用自己时,就像当一个方法再次调用自己时一样。最有可能的是,您在代码执行的某个递归中弄乱了返回条件。在这个网站上,stackoverflow异常显示为downvotes,因为人们认为您之前没有做过任何研究,例如,在搜索引擎中输入异常名称,它的右边是@StephenC,我的错!但不幸的是,我现在无法编辑它。所以我删除了