数据结构中的有序和无序

数据结构中的有序和无序

文章开头首先感谢正在学C++博主

个人最起始的迷惑

我的迷惑来自有序列表这个名词。

在我的印象中有序的数据结构是可以保留插入顺序的一种数据结构。而无序则是指在插入数据时进行了排序、去重等操作的数据结构。

正是因为这个迷惑让我开始了对于有序和无序的思考。

以Python的list和JavaScript的Array为例来说,以下的数据是有序还是无序

# py
arr = [1,3]
arr.append(2)
print(arr) #[1,3,2]
// JavaScript
let arr = [1,3];
arr.push(2);
console.log(arr); // [1,3,2]

下面是疑惑点

  • 如果说上面的是有序的,则可以认为是下标拥有排列顺序
  • 如果说上面的是无序的,则可以认为是值无排列顺序,所以是无序的

正在学C++进行讨论

机缘巧合下,我发现正在学C++博主发布了很多有关算法的博客,本能的觉得老哥铁定知道,然后厚着脸皮向老哥留言了。没想到老哥竟然回复我了,哈哈。

原讨论地址,讨论内容在评论区

这里对讨论内容进行整理

  • Q:

    对于数据结构而言, 有序和无序是指插入元素的顺序还是元素的排列顺序(如从小到大)

  • A:

    任意给一组数,可以说这组数是有序(小到大/大到小)或无序(乱序)的,然后对这组数进行排序使得它按照一个顺序排列。插入元素的顺序,怎么叫有序怎么叫无序?你可以说,对于一组有序的数,把另一个单独的数插入到这组数中使得这组数依旧有序。

  • Q:

    或许是考虑的角度问题,我下面举一个具体一点例子:

    有序链表,此处的有序为元素有排列顺序, 但是有序链表其实是一个无序的数据结构

    数据结构的有序无序是以插入元素的顺序来看的。

    如果在插入元素时 如同set数据结构一样进行了去重, 或者进行了排序打乱了插入的元素, 则认为该数据结构是无序的。

    如同python的list一样,很多人的介绍是一个有序可变的序列

  • A:

    我学习的严蔚敏老师的数据结构中,有序就是指一组数,按某个关键字有序排列,就是有序。

    可以有重复值,可以插入,可以删除,但是有序无序与这些操作没关系。

    有序无序,指的是整体的元素关键字是否按照某个顺序。

    你说的有序链表,我理解的意思是,一组数的逻辑结构是线性的,物理结构是链式存储。我没有懂你说的“有序为元素有排列顺序, 但是有序链表其实是一个无序的数据结构”。

    数据元素相互之间的关系,存在着四种逻辑结构和四种物理结构。你说的是什么数据结构?

    还有,有序无序是以插入元素的顺序来看的,我不懂,可以插入在末尾、在中间在任何一个位置,怎么判断有序无序?

    (个人补充:当我看到可以插入在末尾、在中间在任何一个位置的时候又蒙了,随后看到了老哥在问答中的回答后就明白了)

  • Q:

    讲的很透彻,我大概明白所谓的有序和无序应该站在从什么角度去理解了。谢谢您。


下方为正在学C++老哥在问答上的回答,原文地址

  • Q:

    数据结构中的有序和无序是如何理解的?

    以JavaScript为例

    let arr = [1,3];
    arr.push(2);
    console.log(arr); //[1,3,2]
    

    上方的数组是一个有序的还是无序的呢?

    如果是有序的则可以理解为是以插入顺序来看的;

    如果是无序的则可以理解为是以值的排序顺序来看的;

    目前在看数据结构, 看到有序链表这一块有点懵, 感觉有序和无序的定义很模糊.

  • A:

    这一般来说是无序的。

    排序,是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。

    如果你的关键字是元素的大小,就是无序的。

    如果你为每个元素增加一个属性:位置,1的位置是1,3的位置是2,2的位置是3,且关键字是每个元素的位置,那就是有序。

总结

判断有序和无序需要辩证地来说。

以上面的例子来说:

let arr = [1,3];
arr.push(2);
console.log(arr); //[1,3,2]

如果站在值的角度来说这个数组为无序的,因为它没有对数据进行排序,数据依然是以乱序排列的

如果站在数组本身的实现逻辑的角度来说,它是有序的,因为可以按照索引进行取值,并且索引是有序的

有序集合:集合里的元素可以根据key或index访问
无序集合:集合里的元素只能遍历。

编程是一个不断试错的过程,在这个过程中感谢每一个帮助过我的人,每一个把自己的理解和学习心得无私分享出来人。

如果文章中有不对的地方请您在评论区指出来,我会及时改正。

文章的末尾再次感谢正在学C++博主。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值