邻接表中adj方法暴露了内部数据
来源:2-6 邻接表的实现
mrglint
2020-03-01
bobo老师好,在邻接表中的adj方法返回了相连的顶点,应该将链表复制后返回,不然会对用户暴露了内部数据。。
?
写回答
1回答
-
虽然你说得对,但这样就将 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 太流行了。
继续加油!:)
112020-03-01
相似问题