List.sort(泛型 Comparison)出现stack overflow

liuzhenpolestar 2011-09-19 09:46:49
执行Sort(CompareCost)时偶尔会出现堆栈溢出,真不知道该怎么办了,我看了进行比较的代码,并没有死循环啊!!请各位过目!

openlist.Sort(CompareCost);//将其按F值从小到大排序
private static int CompareCost(Node x, Node y)//Comparison 泛型委托,对openlist列表里的Node按F进行排序(从小到大)
{
if (x == null)
{
if (y == null)
return 0;
else
return -1;
}
else
{
if (y == null)
return 1;
else
{
double Xcost = x.F;
double Ycost = y.F;
int compareResult = Xcost.CompareTo(Ycost);
return compareResult;
}
}
}
...全文
186 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
烈火蜓蜻 2011-11-14
  • 打赏
  • 举报
回复
试图将两个 double变量, 直接 == 判断是不可取的。


而是判断他们之间的差小于我们认为允许的误差(当然这个误差是计算机能表示出的值。)
烈火蜓蜻 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sbwwkmyd 的回复:]

楼主确定是List.Sort造成的堆栈溢出吗?
我又看了一遍List.Sort的源代码,递归层次最多是log(n)层,而且也不受修改影响,最多就是结果不正确。
所以我可以确定堆栈溢出不是List.Sort造成的,楼主最好再确认一下问题根源。

至于6楼的BUG是显而易见的,Sort的正确性在于比较的确定性,而Math.Abs(x.F - y.F) <= 1e-5造成了不确定性,排序结果就……
[/Quote]

这个不确定性? 看来你对这个浮点数的特性还不是很了解,您需要补习一下基础,
double A,B
A和B的差值小于1e-5,
如果A大于B,那么A就一定大于B,而不会下次比较就小于B。没什么不确定性。
liuzhenpolestar 2011-11-13
  • 打赏
  • 举报
回复
我由递归改为循环后就不出现溢出了
stonespace 2011-09-20
  • 打赏
  • 举报
回复
List.Sort使用快速排序还是有可能会栈溢出,
showjim 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 linux7985 的回复:]
C# code
private static int CompareCost(Node x, Node y)//Comparison 泛型委托,对openlist列表里的Node按F进行排序(从小到大)
{
if (x == null || y == null)
return x==y ? 0 : x!=null ? 1 : -1;
else
……
[/Quote]
汗一个,本来没BUG,人为给制造一个BUG
Icedmilk 2011-09-20
  • 打赏
  • 举报
回复
我又试了下,想溢出真的很难啊
你可以用StackTrace看一下堆栈是怎么变化的


private static int stackFrame = 0;

private static int CompareCost(Node x, Node y)//Comparison 泛型委托,对openlist列表里的Node按F进行排序(从小到大)
{
StackTrace st = new StackTrace();
if (stackFrame < st.FrameCount) {
stackFrame = st.FrameCount;
Console.WriteLine(st.FrameCount);
}
...
烈火蜓蜻 2011-09-20
  • 打赏
  • 举报
回复
以上的两个double的值,相差在10的负5次方以内,就可以认为相等,具体你可以自己定义一个值。
烈火蜓蜻 2011-09-20
  • 打赏
  • 举报
回复
 private static int CompareCost(Node x, Node y)//Comparison 泛型委托,对openlist列表里的Node按F进行排序(从小到大)
{
if (x == null || y == null)
return x==y ? 0 : x!=null ? 1 : -1;
else
{
return Math.Abs(x.F - y.F) <= 1e-5 ? 0 : x.F > y.F ? 1 : -1;
}


造成溢出的原因可能是因为,double数字的精度问题,因为double无法精确的表示某个数,可能导致这个问题
showjim 2011-09-20
  • 打赏
  • 举报
回复
楼主确定是List.Sort造成的堆栈溢出吗?
我又看了一遍List.Sort的源代码,递归层次最多是log(n)层,而且也不受修改影响,最多就是结果不正确。
所以我可以确定堆栈溢出不是List.Sort造成的,楼主最好再确认一下问题根源。

至于6楼的BUG是显而易见的,Sort的正确性在于比较的确定性,而Math.Abs(x.F - y.F) <= 1e-5造成了不确定性,排序结果就不一定是预期的了。
showjim 2011-09-20
  • 打赏
  • 举报
回复
List.Sort栈溢出的概率基本上等于0。
如果数据不变,会有溢出的始终会溢出;如果数据在变,偶尔溢出感觉就是在说笑话。
我觉得你的情况应该是在多线程情况下,对同一个List一边排序,一边有修改。
烈火蜓蜻 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sbwwkmyd 的回复:]

引用 6 楼 linux7985 的回复:
C# code
private static int CompareCost(Node x, Node y)//Comparison 泛型委托,对openlist列表里的Node按F进行排序(从小到大)
{
if (x == null || y == null)
return x==y ? 0 : x!=null ? 1 : -1;
els……
[/Quote]

啥Bug,帮助修正一下吧。
Icedmilk 2011-09-19
  • 打赏
  • 举报
回复
堆栈溢出一般是出在递归问题上,与死循环关系不大吧


另外虽然ListSort使用了快排,有一定的递归,但也不至于堆栈溢出吧
liuzhenpolestar 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zh6335901 的回复:]

什么情况下出现了栈溢出
[/Quote]
调用list.sort时啊
zh6335901 2011-09-19
  • 打赏
  • 举报
回复
什么情况下出现了栈溢出

679

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧