平衡复杂性:阵列的故事包括与否定
#javascript #编程 #电脑科学

农民的机器人助手

开发人员不断平衡复杂性和灵活性。想象一下,您是一个有各种水果的农民:苹果,香蕉,橘子和梨。您有一个机器人助手,将水果分成两个垃圾箱,即常规垃圾箱和高级垃圾箱。苹果和香蕉都可以进入 垃圾箱,而橙色和梨是 的高级垃圾箱。每天早晨,机器人都会捡起一个随机的水果,需要决定要去哪个垃圾桶。

作为农民,您的任务是编写指导机器人决策的软件。您可以在两种主要方法之间进行选择。

否定方法

一种方法是编码机器人,以确定水果无法去的地方。如果水果不是橙色而不是梨,则可以放在常规垃圾箱中。

if (fruit !== 'orange' && fruit !== 'pear') {
  regularBin.add(fruit);
}

这种方法简单而灵活。要添加新水果,您只需避免添加新的条件即可。但是,目前尚不清楚哪些水果可以进入常规垃圾箱 - 您必须从没有的水果中推断出来。随着农场的多样化,当添加较少的保费水果时,维持此功能的果实会更容易。

阵列包括方法

另外,您可以列出阵列中每个垃圾箱的水果,并检查水果是否在该数组中。

const regularBinFruits = [ 'apple', 'banana'];

if(regularBinFruits.includes(fruit)){
  regularBin.add(fruit);
}

这种方法更明确和可理解。很明显,哪些水果可以进入常规垃圾桶。但是,就代码而言,它稍微复杂稍微复杂,并且添加新水果需要更新阵列。当农场添加任何普通水果时,农民必须更新阵列。当农场添加高级水果时,不需要更改。

此问题还有其他可能的解决方案。这是其中几个:

  1. 使用字典或地图:这种方法可能非常有效,尤其是当您有大量类别或项目时。您可以将每个项目映射到特定值(true/fals或0/1或任何其他有意义的有意义的值),而不是使用数组或否定逻辑。这样,您可以在恒定时间内检查项目的成员资格。这是一个示例:
let regularBinFruits = { 'apple': true, 'banana': true };

if(regularBinFruits[fruit]){
  regularBin.add(fruit);
}
  1. 使用开关案例结构:如果您有少量项目,并且每个项目都需要不同的操作,则这可能是一个不错的选择。但是,如果您有大量物品,它可能会变得笨拙。
switch(fruit) {
  case 'apple':
  case 'banana':
    regularBin.add(fruit);
    // break is omitted to allow fallthrough
  case 'orange':
  case 'pear':
    premiumBin.add(fruit);
    break;
  default:
    // handle unknown fruit
    break;
}

结论

以此为核心,将项目分类的困境 - 无论是农民的机器人的成果还是软件程序中的变量 - 都是计算机科学和数学的基本问题。它涉及设定的理论,条件逻辑和算法复杂性。这些主题通常被学术术语包围,这可能会使它们看起来令人生畏。

但是,正如我们通过此博客文章中的实际示例所看到的那样,这些概念并不像最初可能出现的那么复杂。他们本质上是根据是否满足某些条件做出决定。我是将这个苹果放在常规垃圾箱或高级垃圾箱中,还是两者兼而有之?

在每种情况下,我们都看到您可以采取不同的方法,每种方法都有自己的权衡。否定方法是简单且灵活的,但可能不太明确。阵列包含的方法更明确,但稍微复杂且灵活性较低。其他解决方案(例如使用地图或开关案例结构)提供了自己的一组优势和缺点。

最后,最佳解决方案始终取决于问题的特定上下文和要求。关键是要了解您的用例,并选择最满足您需求的解决方案。请记住,尽管这些问题可以用学术术语来表达,但它们从根本上讲是关于做出决定的 - 我们每天都在做这件事。因此,不要被行话吓倒。您有能力理解和应用这些概念。