邻接表中adj方法暴露了内部数据

来源:2-6 邻接表的实现

mrglint

2020-03-01

bobo老师好,在邻接表中的adj方法返回了相连的顶点,应该将链表复制后返回,不然会对用户暴露了内部数据。。
?

写回答

1回答

liuyubobobo

2020-03-01

虽然你说得对,但这样就将 adj 函数的时间复杂度抬到了 O(n) 级别,这在很多图论算法中是不可忍受的。后面在具体学习图论算法的时候,你将看到 adj 函数是多么的常用。


这类设计上的平衡是程序员经常面对的问题,必须要取舍。其实这样的例子也很多。比如 Java 的标准库中,所有容器类返回的对象都不是一份拷贝,而是原来的引用。


比如如下的代码:

ArrayList<ArrayList<Integer>> arr = new ArrayList<>();

ArrayList<Integer> e = new ArrayList<>();
e.add(1);
e.add(2);
e.add(3);
arr.add(e);

ArrayList<Integer> x = arr.get(0);
x.add(4);

System.out.print(arr);


x = arr.get(0) 取出 arr 的一个元素,是一个 ArrayList,这个 ArrayList 是一个引用,此时改变 x,就会 改变 arr。


这当然不安全,但没办法,如果让他安全,get 的复杂度就会大增。所以,这就成为了一个"语言特性",所有的程序员需要注意。


值得一提的是,这个问题在 C++ 中可以很容易地使用访问限制符的语法解决。所以,很多时候,我真的觉得 Java 的语言设计问题挺多的。我个人并不是特别喜欢 Java 语言,所以我在慕课网上的前两个算法课程都使用 C++ 语言。但是没办法,后来发现,Java 太流行了。


继续加油!:)

1
1
mrglint
嗯嗯,谢谢老师
2020-03-01
共1条回复

玩转算法系列--图论精讲(Java版)

30+小时系统学习,bobo带你克服被图论支配的恐惧

1591 学习 · 324 问题

查看课程