排序列表时语言*如何知道*

时间:2017-01-11 16:53:12

标签: list sorting

请原谅我,如果这个问题是愚蠢的,但我发现我不知道一种语言如何知道列表是否排序。

说我有一个清单:

["Apple","Apricot","Blueberry","Cardamom","Cumin"]

我要插入"Cinnamon"。 AFAIK我使用的语言并不知道列表已排序;它只是一个清单。并且它没有宽屏"像我们这样的视野,所以它不知道A块的结束位置和C块从列表外部开始。因此,它会将每个数组字符串的第一个字母与插入字符串的第一个字母进行比较。如果insert char更大,则移动到下一个字符串。如果字符匹配,则移动到下一个字母。如果它移动到下一个字符串并且数组的char大于插入的char,那么将插入char。

我的问题是,当列表被排序时,语言是否可以知道? 如果梳理未排序和排序列表的过程是相同的,并且列表仍在迭代中,那么排序如何节省时间?

编辑: 我知道"排序允许依赖于排序的算法工作&#34 ;;我为没有说清楚而道歉。我想我是否有关于在计算机语言内进行排序的内在问题,或者它是否是人们在其上构建的策略。我认为它是后者,你们已经证实了这一点。语言不知道它是否排序,但我们认识到性能差异。

3 个答案:

答案 0 :(得分:1)

这是关键。 语言不会/不能/不应该知道您的数据结构是排序还是未排序。事实上,它甚至不关心它究竟是什么数据结构。

现在考虑一下:插入或删除真正意味着什么?插入新项目或删除现有项目需要采取哪些确切步骤。事实证明,这些操作的确切含义取决于您使用的数据结构。数组将以非常不同的方式插入新元素。

因此,必须在应用这些操作的数据结构的上下文中定义这些操作。 语言通常不提供任何关键字来处理这些数据结构。相反,附带的库提供了这些结构的内置实现,其中包含执行这些操作的方法。

现在回答最初的问题:语言"如何知道"如果列表是否排序,为什么处理排序列表更有效?答案是,从我上面所说的内容可以明显看出,语言并不是也不应该知道列表的内部结构。您正在使用的列表结构的实现知道它是否已排序,以及如何以有序方式插入新节点。例如,某个数据结构可以使用索引(很像书的索引)来定位以某个字母开头的单词的位置,从而减少未排序列表遍历整个单元所需的时间量。列表,一次一个元素。

希望这会让它更清晰。

答案 1 :(得分:0)

  

列表排序后,语言是否可以知道

你是说语言翻译吗?当然,可以检查列表是否已排序,只需检查每个元素是否更大"比以前的。我怀疑口译员这样做;他们为什么要关心列表是否排序?

一般来说,如果你想插入" Cinammon"在列表中,您需要指定插入位置,或者只是在最后添加它。如果列表事先已经排序,那么对解释器来说并不重要。它是如何使用列表来确定排序列表是否将保持排序,以及是否需要对其进行排序。 (例如,如果您尝试使用二进制搜索在列表中查找某些内容,则必须对列表进行排序。但是必须安排这样做。)

  

AFAIK我使用的语言......

(这是?)

  

...不知道列表已排序;它只是一个清单。并且它没有宽屏"像我们这样的视野,所以它不知道A块的结束位置和C块从列表外部开始。因此,它会将每个数组字符串的第一个字母与插入字符串的第一个字母进行比较。如果insert char更大,则移动到下一个字符串。如果字符匹配,则移动到下一个字母。如果它移动到下一个字符串并且数组的char大于插入的char,那么将插入char。

我想,你所说的是,它寻找的第一个元素是"大于"插入的那个,并在它之前插入新元素。这意味着它维持"排序"列表的属性,如果它已经排序。对于未排序列表的情况,这非常低效。此外,您描述的用于查找插入点(线性搜索)的技术将是低效的,如果这确实是正在发生的事情。我怀疑你对列表/语言语义的理解是不正确的。

如果你用特定的语言提供一个具体的例子,那将会有很大的帮助。

答案 2 :(得分:0)

语言不知道这些事情。

某些编程语言附带一个包含数据结构的标准库,如果没有,通常可以链接到那些库。

其中一些数据结构可能是维护秩序的集合类型。

因此,假设您有一个表示有序集合类型的数据结构,那么每当添加或删除项目时,该数据结构都会维护集合的顺序。

如果你使用的是最基本的集合类型,一个数组,那么语言,运行时和数据结构本身(数组)都不会在任何时候插入项目。