分享

【每日一答】(83)我《大数据》课的问题:高效数组链表删除数据用最后一个元素覆盖,原有顺序就被打乱了

 大零蛋老师 2020-09-15



问:老师,请问CBArrLink的删除方法为什么要用最后一个元素覆盖被删除位置的元素,这样原有的顺序不就被打乱了么

答:看了一下通用模块代码,非常好 
是这样的,作为数组来说,如果删除中间一个元素,是不是要把后面的元素依次前移填补空白?这样的话,原来第几个下标的元素的下标,都会变吧
所以我们的数组链表的元素下标,也会动态变化,不可能是固定的。也就是你的数据,哪个数据对应哪个下标,是动态的。例如不能说现在a[1]的值是5,过一会a[1]的值还是5。但是5这个数据是始终在里面的,但不一定位于哪个空间。

这样的话删除效率非常高!

如果你需要把下标1和数据5总是绑定,那么不要用数组链表,要用哈希表。哈希表中,设置键为1,数据为5,这样1和5总是绑定的

明白了不

还有一点,你可能考虑数据结构内各元素已排序的情况下,比如按大小顺序有序存放 
这种情况下,高效的做法是,增删的时候随意,在增删结束后,再统一做一次排序,这样的效率更高
比每次增删都维护原始顺序的效率要高得多。
每次增删都为了维护顺序的话,那么你要每次增删都做非常大的开销:要循环查找数据的位置、要移动数据元素的位置
如果增删操作很多,整个效率就会非常低了!


那么还不如很快速地完成增删动作,后面统一排序,只需排序一次

问:嗯嗯,我明白您的意思。但是如果删除的规则变成这样的话,用普通的数组不也可以么,只需要用两个指针记录头尾位置,或者用一个变量存储数组长度。需要删除某个元素的时候,用最后一个覆盖删除位置元素,然后尾指针前移,数组长度--。也不涉及多个元素的移动,因为这实际上是对数组定义的改变吧

是的,非常正确!
这就是高效的做法,也是和之前一年级学的基础不一样的
但是,普通数组有一样,你预先开辟多大的空间呢?我要中途添加数据空间不够了,怎么动态扩大呢?还有最后的资源释放……这些都要考虑,比较麻烦。
用我们的高效数组链表类,这些都考虑好啦,可以方便直接用

嗯嗯,明白了,谢谢您




    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多