繁体   English   中英

使用用户定义的函数了解数组排序或比较函数回调

[英]Understanding array sorting or comparison function callbacks using user-defined functions

假装我不知道自己在做什么,我不知道。 您能解释需要回调的数组排序和比较功能如何工作吗?

uasort()函数为例。 我应该如何设计一个回调函数来使用它? 尝试对数据进行排序时,“-1”,“ + 1”和“ 0”是什么意思? 它会扫描所有数组元素吗? 还是比这更有效? 如果我希望“ w”在“ b”之前,而“ a”在“ x”之前,该怎么办? 您可以在这个看似简单的领域中提供的任何建议将不胜感激。

我会试一下!

例如,让我们列出一个名称列表。 你们俩我都知道如何按字母顺序对名称列表进行排序,并完成了一百亿亿次。 同样的事情也适用于数字。 在排序可能不太直观的地方,计算机需要能够对数据进行排序。

用于对数组进行排序的回调函数涉及允许该数组包含任意种类的数据的想法,其中回调提供了“规则”以说明该数组中的任何两个项目如何相互关联。 这样,排序算法可以获取该数据数组,重复调用“回调”函数以确定哪些元素按哪个顺序属于哪个,然后返回排序后的列表。 这就是回调的本质。

如果您要进行字面类比,请假装将数据列表交给朋友,他们只知道排序的方法 ,却不知道列表中的项目如何关联。 他们“回电”给您,问一个问题:“这两个要素中的哪个首先出现?” 然后,您了解了数据和规则,拿走了物品,应用了规则,然后将答案告诉了朋友。 最终,在多次重复此过程之后,您的数据将返回给您进行排序。

这样,返回-1、0或1的“回调”将返回一个值,该值表示,当用两段数据调用时,-1表示“项目1优先于项目2”,0表示“项目1等于项目” 2,+ 1则表示“项目1紧跟项目2”。 您只需提供比较,即可根据数据规则确定返回哪个值。 您可以定义任意数据集,并定义问题“空间”内所需的任何优先级规则。 顺便说一句,这是面向对象编程的重要组成部分-我可以利用这种“回调”思想来实现复杂排序算法的通用版本,而从不知道或不关心要排序的数据的种类 -所有这些都是因为程序员使用这种“罐头”分类机制将提供常规例程所需的“逻辑管道”。

我认为这是一个不错的解释,而且一切都与语言无关! :)希望能有所帮助。

编辑。 让我举一个例子:

List:

Item #  Value
1        12
2        15
3         9
4        26
5         4

如果我打算在列表中找到最小的项目,那么我将从项目1开始,然后将其与列表中其余的每个项目进行比较。 所以,首先,我将比较项目1和项目2:

compare(item(1),item(2))

它将返回-1,因为12的值 15 之前 。现在,我转到列表中的一项:

compare(item(1),item(3))

这次返回1,因为12 跟随 9,这意味着item(3)现在是到目前为止找到的最小项。 现在,我们进行比较:

compare(item(3),item(4))

在这种情况下,比较返回-1,因为9在26之前,从而导致我们进行最终比较:

compare(item(3),item(5))

该调用将返回+1,因为9在4之后。当我们用尽列表中的所有项目时,我们知道item(3)是最小的项目。 然后,我们将该项目替换为“先前”的顶部项目,并重复从item(2)开始的整个过程。 这是一个臭名昭著的效率低下的“气泡排序”的示例,但出于此说明的目的而工作。 这就是“第一项”和“第二项”引用的来源。 不管使用哪种语言,排序都像计算机科学中的任何其他问题一样,归结为将大问题分解为小问题,归类为归纳为重复比较较大列表中的两个项目。

首先,请阅读手册。 摘要页面是查看指定种类的好地方。 要回答您的一些问题:

当然,排序会扫描所有数组元素。 还怎么知道最后一个元素可能放在哪里? 但这不是真的相关。 您无需了解使用哪种排序算法。 您只需要提供一个知道如何比较数组中任何两个项目的函数, 而无需考虑其他任何项目

排序算法发挥了魔力,只要它想知道哪个元素“先于”另一个就调用函数。 它使用两个项(分别作为参数)调用函数。

您的函数返回:

  • 如果第一项小于第二项,则为-1(或小于零的任何数字)。
  • 如果相等则为0
  • 如果第一项大于第二项,则为1(或大于零的任何数字)。

您可以编写一种方法来执行任何类型的排序。 如果您希望'w'出现在'b'之前,那么如果第一个参数以'w'开头并且第二个参数以'b'开头,则希望返回-1。 对我来说,设计一个示例太麻烦了,以至于不愿意编写示例函数。

但是,在学习如何编写回调之前,首先需要真正有理由进行排序,以便有一个要实现的目标。

运行此示例以查看sort函数调用回调的次数:

<?php

function mysort($a, $b)
{
  echo "$a vs $b\n";

  return $a - $b;
}

// randomly create an array with 1 to 20 as elements
$data = range(1,20);
shuffle($data);    

// before
print_r($data);

// sort
usort($data, 'mysort');

// after   
print_r($data);

它使用您的函数告诉它的有关如何订购两个单独物品的信息,使用排序算法对数组进行系统地排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM