大o表示法描述复杂度

This is the first post in my series Data Structures & Algorithms. As a boot camp grad, I found that once I started my professional career in software development, there was a gap in my fundamentals knowledge. Although I am not reversing a binary tree day-in-and-day-out, I do think it is important to learn these fundamentals simply because you will be a better developer by knowing they exist. This week I start things off by discussing Time and Space Complexity, and how you can use Big O notation to determine these metrics.

这是我的系列数据结构和算法中的第一篇文章。 作为一个新兵训练营的毕业生,我发现一旦我开始了软件开发的职业生涯,我的基础知识就会出现空白。 尽管我没有日复一日地逆转二叉树,但我确实认为学习这些基础知识很重要,因为您将因为知道它们的存在而成为更好的开发人员。 本周,我将从讨论时间和空间复杂度以及如何使用大O表示法确定这些指标开始。

时间复杂度 (Time Complexity)

A measurement of computing time that an algorithm takes to complete

一种算法完成计算时间的度量

What causes time complexity?

是什么造成时间复杂性?

  • Operations (+, -, *, /)

    操作( +-*/ )

  • Comparisons (>, <, ==)

    比较( ><== )

  • Looping (for, while)

    循环播放( forwhile )

  • Outside function calls (function())

    外部函数调用( function() )

大O符号 (Big O Notation)

The language and metric we use for talking about how long it takes for an algorithm to run

我们用于讨论算法运行需要多长时间的语言和指标

O(1)恒定时间 (O(1) Constant Time)

Not bound by the size of an input, only one operation is performed

不受输入大小的限制,仅执行一项操作

  • Direct query of data you are looking for直接查询您要查找的数据
  • No iterating (loops) are involved不涉及迭代(循环)

If you know the precise location of data you want to pull out of an Object {} or Array [], you can query for that item without having to iterate or perform any additional computation.

如果您知道要从Object {}或Array []提取数据的精确位置,则可以查询该项目,而不必进行迭代或执行任何其他计算。

Most of the time, if you’re using Constant Time, you are in good shape from a performance standpoint.

在大多数情况下,如果您使用的是Constant Time ,那么从性能的角度来看,您的状态会很好。

Let me show you an example in which I perform tasks that evaluate to Constant Time:

让我向您展示一个示例,在该示例中,我执行评估为“ 恒定时间”的任务:

First, I use the const keyword to declare a new variable with the identifier jedi and give this variable a collection of string values

首先,我使用const关键字声明一个标识符为jedi的新变量,并为该变量提供string值的集合

Next, I use the function keyword to create a new function and give it the identifier findAJedi. This function will have a single parameter with an identifier of jediList

接下来,我使用function关键字创建一个新函数,并为其赋予标识符findAJedi 。 该函数将具有一个标识符为jediList的单个参数

Using bracket notation [] I pull out the entry that is in index position 1

使用括号符号[]拔出索引位置1的条目

Since we already know where the data we want is, and we do not have to loop to get there, this operation is O(1) or Constant Time

因为我们已经知道我们想要的数据在哪里,并且我们不必循环到达那里,所以此操作为O(1)恒定时间

We call the findAJedi function with the variable jediList as the single argument and our findAJedi function prints anakin. He is the chosen one, right?

我们称findAJedi与可变功能jediList作为单独的参数和我们findAJedi功能打印anakin 。 他是被选中的人,对吗?

O(n)线性时间 (O(n) Linear Time)

Bound by the input, time increases linearly as input increases

受输入的约束,时间随着输入的增加而线性增加

  • Involves iteration to find a value (for orwhile loops)

    涉及迭代以查找值( forwhile循环)

Let me show you an example of an operation that evaluates to O(n) or Linear Time:

让我向您展示一个计算结果为O(n)线性时间的示例:

First, we use the const keyword to create a new variable with the identifier jedi that is assigned the value of an Array. We use the fill() method to populate this Array with five luke values that are of type string

首先,我们使用const关键字创建一个标识符为jedi的新变量,该变量被分配了Array的值。 我们使用fill()方法用五个类型为string luke值填充此Array

Next, we use the function keyword to create a new function with an identifier findLuke. This function will have a single parameter with an identifier of jediList

接下来,我们使用function关键字创建一个带有findLuke标识符的新函数。 该函数将具有一个标识符为jediList的单个参数

function findLuke(jediList) {

Inside of our findLuke function use the for keyword to create a for loop. We iterate through our jediList and use bracket notation [] to compare each entry to luke, when we find a match we console.log it

在我们的findLuke函数内部,使用for关键字创建一个for循环。 我们遍历jediList并使用方括号[]将每个条目与luke进行比较,找到匹配项后,我们进行console.log

for (let i = 0; i < jediList.length; i++) {if (jediList[i] === "luke") {console.log("found luke")}
}

Since we are iterating through the entire Array, our Big O would be O(n). Right now our jediList only has five entries, but what if we had 10,000, or 1,000,000,000? These are good considerations to think about as you write code.

由于我们要遍历整个Array ,因此我们的Big O将为O(n) 。 现在,我们的jediList只有五个条目,但是如果我们有10,000或1,000,000,000,该怎么办? 这些是编写代码时要考虑的好考虑因素。

We call our findLuke function that takes a single argument jedi and since all of our entries are luke, we console.log luke five times

我们调用带单个参数jedi findLuke函数,由于所有条目都是luke ,所以我们console.log luke五次

findLuke(jedi)
// found luke
// found luke
// found luke
// found luke
// found luke

O(n²)二次时间 (O(n²) Quadratic Time)

Often thought of as “worst case”, multiple nested iterations occur

通常被认为是“最坏的情况”,发生了多次嵌套迭代

  • Involves two nested loops涉及两个嵌套循环
  • Each item in two collections need to be compared to each other两个集合中的每个项目都需要相互比较

I am sure that you have been here before, I know I sure have. Nesting loops is never a good idea and there is a good reason for that. Speaking in terms of Big O, when you are iterating over a collection, and then iterating again inside of that first iteration that will produce a Big O of O(n²)

我敢肯定你以前来过这里,我知道我确实曾经来过。 嵌套循环从来都不是一个好主意,这是有充分理由的。 说到大O,当您遍历一个集合,然后在第一次迭代内部再次迭代时,将产生O(n²)的大O。

Let me show you an example of a function that produces a Big O of O(n²):

让我向您展示产生O(n²)的Big O的函数示例:

const jedi = ["mace windu", "yoda", "obi wan"];function logJediDuos(jediList) {for (let i = 0; i < jediList.length; i++) {for (let j = 0; j < jediList.length; j++) {console.log(jediList[i], jediList[j]);}}
}logJediDuos(jedi);

First, we use the const keyword to create a new variable with the identifier jedi that is assigned to an Array of three string values

首先,我们使用const关键字创建一个标识符为jedi的新变量,该变量分配给三个string值的Array

const jedi = ["mace windu", "yoda", "obi wan"]

Next, we use the function keyword to create a new function with an identifier of logJediDuos. This function has a single parameter jediList

接下来,我们使用function关键字创建一个具有logJediDuos标识符的新函数。 该函数具有单个参数jediList

function logJediDuos(jediList) {

Inside of logJediDuos we use the for keyword to create our first for loop. In our for statement we declare that we want to iterate through the length of jediList until that length is greater than the value of i. We increase the value of i after each iteration

logJediDuos内部,我们使用for关键字创建第一个for循环。 在for statement我们声明我们要迭代jediList的长度,直到该长度大于i的值。 每次迭代后我们增加i的值

for (let i = 0; i < jediList.length; i++) {

Inside of the previous for loop, we create another for loop. Inside of our for statement we make sure to give our index variable an identifier of j to ensure we do not mutate the state of our i variable.

在前面的for循环内部,我们创建了另一个for循环。 在for语句中,我们确保为索引变量赋予j的标识符,以确保我们不会使i变量的状态发生变化。

Using bracket notation [] we use our index variables i and j to console.log each pair inside of our jediList

使用括号符号[]我们使用索引变量ijconsole.logjediList内部的每一对

for (let i = 0; i < jediList.length; i++) {for (let j = 0; j < jediList.length; j++) {console.log(jediList[i], jediList[j])}
}

When we invoke our logJediDuos function we get this result:

当我们调用我们的logJediDuos函数时,我们得到以下结果:

logJediDuos(jedi)
// mace windu mace windu
// i = 0, j = 0
// mace windu yoda
// i = 0, j = 1
// mace windu obi wan
// i = 0, j = 2
// yoda mace windu
// i = 1, j = 0
// yoda yoda
// i = 1, j = 1
// yoda obi wan
// i = 1, j = 2
// obi wan mace windu
// i = 2, j = 0
// obi wan yoda
// i = 2, j = 1
// obi wan obi wan
// i = 2, j = 2

I am only covering a handful of common Big O times in this post. If you want to learn more about advanced Big O times you can do so by following the links provided below:

在这篇文章中,我仅介绍几个常见的大O时代。 如果您想了解有关高级大O时间的更多信息,可以通过下面的链接进行操作:

O(n!)阶乘时间 (O(n!) Factorial Time)

Adds a nested loop for every loop

为每个循环添加一个嵌套循环

Read more here

在这里

O(log N)对数 (O(log N) Logarithmic)

Involves searching algorithms if sorted

如果排序,则涉及搜索算法

Read more here

在这里

O(2 ^ N)指数 (O(2^N) Exponential)

Recursive algorithms that solve a problem of size N

解决大小为N的问题的递归算法

Read more here

在这里

简化大O (Simplifying Big O)

  • Always assume worst-case scenario始终假设最坏的情况
  • Remove constants删除常量
  • Different terms for inputs输入的不同术语
  • Drop non-dominants掉落非优势

始终假设最坏的情况 (Always assume worst-case scenario)

It is a very common practice to iterate through a list of data in your program, and lists can vary greatly in size. When I say to always assume worst-case scenario I mean that in a few different ways.

遍历程序中的数据列表是一种非常普遍的做法,列表的大小可能相差很大。 当我说总是假设最坏的情况时,我的意思是说有几种不同的方式。

  • If you query for data, assume it is the last item in the list如果查询数据,则假定它是列表中的最后一项
  • Assume the list you’re iterating through will get bigger假设您要遍历的列表会更大
  • Assume some machines will run your algorithm slower than on your machine假设某些计算机的算法运行速度比计算机上的算法慢

删除常量 (Remove constants)

When we are determining the Big O of an algorithm it helps to remove repeated measurements (constants). This allows us to get a more clear read on the speed of the algorithm by removing unneeded calculation.

当我们确定算法的Big O时,它有助于去除重复的测量值(常数)。 这样,通过删除不需要的计算,我们可以更清楚地了解算法的速度。

Let me show you an example where we remove constants:

让我向您展示一个删除常量的示例:

function printJedi(jediList) {jediList.forEach((jedi) => {console.log(jedi)}// O(n)jediList.forEach((jedi) => {console.log(jedi)}// O(n)
}printJedi(['anakin', 'obi wan', 'yoda'])// O(n) + O(n) = O(2n)

First, we create a new function with the identifier printJedi, this function has a single parameter (jediList)

首先,我们使用标识符printJedi创建一个新function ,该函数具有单个参数( jediList )

function printJedi(jediList) {

Inside of our printJedi function we call the forEach() method on jediList two separate times

我们的内部printJedi功能我们称之为forEach()的方法jediList两个独立的次

jediList.forEach((jedi) => {console.log(jedi)
}
// O(n)jediList.forEach((jedi) => {console.log(jedi)
}
// O(n)

Since we are iterating through the entire jediList array, each operation is O(n). At the end of our function, we add up our Big O (O(n) + O(n)) which results in O(2n). We can simplify this by removing the constants which in this case is 2. After this, we are left with Big O of O(n).

由于我们要遍历整个jediList数组,因此每个操作都是O(n) 。 在函数的最后,我们将Big O( O(n) + O(n) )相加,得出O(2n) 。 我们可以通过删除在这种情况下为2 的常量来简化此过程。 之后,我们剩下O(n) Big O。

输入的不同术语 (Different terms for inputs)

In cases that you iterate through different pieces of data, the Big O calculation will reflect that. Since each collection of data will most likely be different sizes, the consideration of its time complexity comes into play.

如果您遍历不同的数据,Big O计算将反映出这一点。 由于每个数据集合很可能具有不同的大小,因此需要考虑其时间复杂性。

Let me show you an example of calculating Big O while using multiple collections of data:

让我向您展示一个使用多个数据集合计算Big O的示例:

function printJediAndSith(jediList, sithList) {jediList.forEach(jedi => console.log(jedi))sithList.forEach(sith => console.log(sith))
}printJediAndSith(["anakin", "obi wan"], ["vader", "sidious"])// O(a + b)

Above, we create a new function with the identifier printJediAndSith, this function has two parameters: jediList and sithList

上面,我们用标识符printJediAndSith创建了一个新function ,该函数有两个参数: jediListsithList

function printJediAndSith(jediList, sithList) {

Inside of printJediAndSith we call the forEach() method on the jediList array and the sithList array

printJediAndSith内部,我们在jediList数组和sithList数组上调用forEach()方法

jediList.forEach(jedi => console.log(jedi))sithList.forEach(sith => console.log(sith))

Now, what do you think the Big O is of the printJediAndSith function? Since we iterate through a collection of data it should be O(n), right? Not in this case.

现在,您认为printJediAndSith函数的大O是什么? 由于我们遍历数据集合,因此应该为O(n) ,对吗? 在这种情况下不行。

Remember, these parameters will likely have different lengths. It is because of this that we determine the Big O of printJediAndSith to be O(a + b).

请记住,这些参数的长度可能不同。 因此,我们确定printJediAndSith的Big O为O(a + b)

掉落非优势 (Drop non-dominants)

Inside of functions a lot of different things can happen. This includes the range of time complexity as well. When determining the Big O of an algorithm, for the sake of simplifying, it is common practice to drop non-dominants. In short, this means to remove or drop any smaller time complexity items from your Big O calculation.

在函数内部,可能发生许多不同的事情。 这也包括时间复杂度的范围。 在确定算法的Big O时,为了简化起见,通常的做法是舍弃非主要对象 。 简而言之,这意味着从Big O计算中删除或删除任何较小的时间复杂性项。

Let me show you an example of dropping non-dominants:

让我向您展示删除非主要对象的示例:

function printAndSumJediAttendance(jediList) {jediList.forEach(list => console.log(list))jediList.forEach(firstList => {jediList.forEach(secondList => {console.log(firstList + secondList)})})
}printAndSumJediAttendance([1983, 66, 1138, 94, 1977])

First, we create a new function with the identifier printAndSumJediAttendance, this function has a single parameter jediList

首先,我们创建了一个新的function与标识符printAndSumJediAttendance ,这个函数有一个参数jediList

function printAndSumJediAttendance(jediList) {

Inside of printAndSumJediAttendance we call the forEach() method on the jediList parameter. Because we are iterating through a collection of data this Big O evaluates to O(n).

printAndSumJediAttendance内部,我们在jediList参数上调用forEach()方法。 因为我们正在遍历数据集合,所以这个大O求值为O(n)

jediList.forEach(list => console.log(list))

On the next line, we call the forEach() method on our jediList parameter. Inside of this forEach block, we call forEach on jediList again. Because we are iterating through nested loops, our Big O evaluates to O(n²)

在下一行,我们在jediList参数上调用forEach()方法。 在此forEach块内部,我们再次在jediList上调用forEach 。 因为我们要遍历嵌套循环,所以我们的大O求值为O(n²)

jediList.forEach(firstList => {jediList.forEach(secondList => {console.log(firstList + secondList)})
})

Let me break this Big O calculation down a bit:

让我将这个大O的计算分解一下:

function printAndSumJediAttendance(jediList) {// O(n)jediList.forEach(list => console.log(list))// O(n^2)jediList.forEach(firstList => {jediList.forEach(secondList => {console.log(firstList + secondList)})})
}
// O(n + n^2) -> simplified -> O(n^2)

As you can see, if we add up the Big O calculations from this function, we are left with a result of O(n + n²).

如您所见,如果我们将这个函数的Big O计算结果相加,则会得到O(n + n²)

If we analyze this, we see that the part of our calculation with the largest Big O is — because of this, we drop the n. We do this because is more _dominant_ than n. Once we have refactored our calculation, we are left with this result: O(n²).

如果我们对此进行分析,我们会发现计算中具有最大Big O的部分为因此,我们将n丢弃。 我们这样做是因为不止_dominant_ n 。 重构计算后,将得到以下结果: O(n²)

空间复杂度 (Space Complexity)

Parallel to time complexity, space complexity is the measurement of memory (space) that an algorithm needs

与时间复杂度并行的是,空间复杂度是算法需要的内存(空间)的度量

是什么导致空间复杂性? (What causes Space Complexity?)

  • Variables变数
  • Data structures数据结构
  • Function calls函数调用
  • Allocations分配

Let me show you an example of how we would calculate the space complexity:

让我向您展示如何计算空间复杂度的示例:

function buildALightsaber(pieces) {let totalPieces = 0 // O(1)totalPieces = 4 // O(1)for (let i = 0; i < pieces.length; i++) {// O(n)addCrystals() // O(n)const hasTheForce = true // O(n)totalPieces++ // O(n)}return totalPieces // O(1)
}// O(3 + 4n) -> simplified -> O(n)

First, we create a new function with the identifier buildALightsaber that has a single parameter pieces

首先,我们创建了一个新的function与标识符buildALightsaber有一个参数pieces

function buildALightsaber(pieces) {

Inside of buildALightsaber, we use the let keyword to create a new variable with the identifier totalPieces that is assigned to the value 0. On the following line, we reassign the variable totalPieces to the value of 4

buildALightsaber内部,我们使用let关键字创建一个标识符为totalPieces的新变量, totalPieces其分配给值0 。 在下一行,我们将变量totalPieces重新分配为值4

Creating and assigning values to variables is O(n) (constant time); therefore, these two steps are both O(1)

为变量创建和分配值的时间为O(n) (恒定时间); 因此,这两个步骤都是O(1)

let totalPieces = 0; <-- // O(1)
totalPieces = 4; <-- // O(1)

Next, we create a for loop and iterate through pieces

接下来,我们创建一个for循环并遍历各个pieces

Since we are going to be iterating through a collection of data, the Big O of this operation will evaluate to O(n)

由于我们要遍历数据集合,因此此操作的Big O将评估为O(n)

for (let i = 0; i < pieces.length; i++) { <-- // O(n)

Inside of our for loop, we call a function with an identifier addCrystals(). Next, we use the const keyword to create a variable with the identifier hasTheForce and assign it the value true. Last, we increment our totalPieces by one.

for循环内部,我们调用一个带有标识符addCrystals()的函数。 接下来,我们使用const关键字创建一个标识符为hasTheForce的变量,并将其赋值为true 。 最后,我们将totalPieces加1。

In terms of evaluating space complexity while calling functions, creating variables, and updating the values of variables inside of an iteration (for or while loops), you have to be mindful of the fact that these actions will occur for each iteration. It is because of this that all actions mentioned will be O(n)

关于在调用函数,创建变量以及在迭代内部( forwhile循环)中更新变量的值时评估空间复杂性,您必须注意以下事实:每次迭代都会发生这些操作。 因此, 所有提到的动作都是O(n)

addCrystals(); <-- // O(n)
const hasTheForce = true; <-- // O(n)
totalPieces++; <-- // O(n)

After we finish iterating through pieces we return the value of totalPieces

完成对pieces迭代之后,我们返回totalPieces的值

Since this is a single action, the Big O is evaluated to O(1) or constant time

由于这是单个操作,因此将大O评估为O(1)恒定时间

return totalPieces; <-- // O(1)

If we calculate the Big O of this function we originally get (3 + 4n). After we apply our principles of simplifying Big O, we know that we can remove constants which will make our final result O(n)

如果我们计算此函数的Big O,则最初得到(3 + 4n) 。 应用简化Big O的原理后,我们知道可以删除常数 ,从而使最终结果为O(n)

综上所述 (In Summary)

I hope after reading this you have a solidified idea of how time and space complexity work, what their importance is in the functions/algorithms we write, and how we can calculate these complexities using Big O notation.

我希望阅读完这篇文章后,您对时间和空间复杂度的工作方式,它们在我们编写的函数/算法中的重要性以及如何使用Big O表示法计算这些复杂度的想法有一个扎实的认识。

Next week I will begin to take a deep dive into arguably the most popular data structure JavaScript developers use, the Array. See you then!

下周,我将开始深入探讨可以说JavaScript开发人员使用的最流行的数据结构Array。 回头见!

翻译自: https://medium.com/dev-genius/time-complexity-space-complexity-and-big-o-notation-500d6104f727

大o表示法描述复杂度


http://www.taodudu.cc/news/show-7162470.html

相关文章:

  • 手脱PE Pack v1.0
  • 手动搭建kubernetes集群(四)
  • Chapter 3 - Client LDAP Operations
  • 深入源码分析SpringBoot中使用@ConditionalOnBean无效的问题(@ConditionalOnBean did not find any beans of type)
  • springboot的@ConditionalOnBean注解
  • 百度跨平台AI推理加速引擎:Anakin
  • 大规模稀疏数据分布式模型训练+Anakin Optimizaiton
  • 百度跨平台AI推理加速引擎--Anakin
  • 处女篇-写给自己看的
  • 三个处女结婚后的反映
  • 写一个简单的打谱程序(1)
  • python 输入1-7,输出对应的星期几
  • 输入数字1到7,输出对应的星期几
  • Js 中文显示星期几方法
  • 从键盘输入一位整数,当输入1~7时,输出“星期一”~“星期日” 输入其他数字时,提示用户重新输入,输入0,程序结束
  • thinkpad SL410k 28747GC 解决“电池不是lenovo电池”的误报问题(最终版)
  • THINKPAD笔记本电脑电池使用技巧
  • thinkpad E40的电池问题
  • 达人评测 2022款联想ThinkPad T16和T14区别是什么,哪个好
  • Thinkpad在linux(ubuntu)下修改电池充电阈值,成功解决Thinkpad在Linux下的电池充电问题
  • 英语速成的窍门—你需要掌握这些【胶水词】
  • <<English Words>> 看到英语词就懵逼? 还要回想半天? 一篇文章让你牢牢掌握
  • 学习英语的好帮手,WorldWord
  • Linux模板机及集群相关操作整理
  • 基于模板匹配的车牌识别系统实例
  • 嵌入式Ai方案介绍
  • 多个相机拍摄定位_大幅面多相机高精度定位及测量解决方案
  • 【实验九 模板】
  • 黑苹果日记五(USB)
  • 黑苹果如何在macOS Sonoma中驱动博通网卡

大o表示法描述复杂度_时间复杂度,空间复杂度和大O表示法相关推荐

  1. Algorithms_入门基础_时间复杂度空间复杂度

    文章目录 算法的基本特征 & 设计原则 基本特征 设计原则 评价算法的两个重要指标 时间复杂度 定义 表示方法 如何计算时间复杂度 几种常见的时间复杂度 如何分析时间复杂度 常数 O(1) 对 ...

  2. 时空复杂度(时间复杂度/空间复杂度)O(1)、O(n)、O(n^2)、O(log n)、O(n log n)是什么意思?...

    大O符号是算法复杂度的相对表示.它描述了时空复杂度. 大O符号是我在大学里学过的东西之一,我了解过这个算法的概念.我知道的不算多,可以回答一些基本的问题,仅此而已.从大学毕业以后,我对这个算法的了解基 ...

  3. 大文件分片上传前端框架_无插件实现大文件分片上传,断点续传

    文件上传.gif 1. 简介: 本篇文章基于实际项目的开发,将介绍项目中关于大文件分片上传.文件验证.断点续传.手动重试上传等需求的使用场景及实现: 2. 项目需求 在一个音视频的添加中,既要有音视频 ...

  4. 大数据可视化陈为智慧树_知到智慧树大数据可视化网课答案

    黑度表明物体的辐射能力接近黑体的程度,其值大小与物体的()有关.A.种类B.表面状况C.表面温度D 压强差的大小可以用一定高度的液体柱来表示.() 海浪干扰抑制电路一般抑制范围是____海里.A.0. ...

  5. 基坑计算理论m法弹性支点法_基坑支护结构弹塑性计算方法与m法的对比分析

    月                      Chinese Journal of Geotechnical Engineering                      Nov.,  2006 ...

  6. k折交叉验证法的额外步骤_教你几招蝴蝶结系法步骤,OMG!这怎么配都美

    到了这种季节,怎样给自己的丝带绑个漂亮的结,这可真是令人最头疼的一件事了.要说绑带要怎么绑才好看,这几招蝴蝶结系法就很实用,简单大气又不失美感. 衬衫上的蝴蝶系法 步骤一:将带子两端像这样叠放,左边在 ...

  7. 回溯法采用的搜索策略_五大常用算法之四:回溯法

    1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向 ...

  8. 大数据在高校的应用场景_制造业人工智能8大应用场景

    随着智能制造热潮的到来,人工智能应用已经贯穿于设计.生产.管理和服务等制造业的各个环节. 人工智能的概念第一次被提出,是在20世纪50年代,距今已六十余年的时间.然而直到近几年,人工智能才迎来爆发式的 ...

  9. 云痕大数据考试中途可以退出吗_借助云痕大数据进行高效复习化学的实践研究.docx...

    借助云痕大数据进行高效复习化学的实践研究 摘要:在复习阶段,很多教师对学情把握不准,导致上课时容易简单.机械的罗列知识点,学生学习热情难以激发,复习效果不佳.借助云痕大数据,可以对学情进行深度了解,对 ...

最新文章

  1. matlab二值化图像_小白啃骨头之图像识别
  2. 关于类中的引用、常量、静态常量的初始化
  3. 双机热备_什么是双机热备?
  4. 机器学习导论(张志华):核定义(2)
  5. spring mvc 渲染html,在Spring MVC中使用Thymeleaf模板渲染Web视图
  6. LookupError: No installed app with label 'user'
  7. SAP UI5 enhancement on resourceBundle
  8. 2007年度工作总结
  9. python动态调用自定义模块_python importlib动态导入模块 reload重载模块
  10. Qt网络编程-简易版TcpServer入门Demo(2)
  11. 超市在线购物商城源码分享
  12. 俞敏洪:度过有意义的生命(转)
  13. android dropbox目录,通过Android上传文件到Dropbox文件夹
  14. 个人计算机名称大全,个人取名方法大全
  15. 利用jsPDF把图片转成pdf格式保存本地指定目录
  16. 因为一个bug来深入探讨下分页插件PageHelper
  17. 2020年4月份DB-Engines数据库最新排名
  18. Maven整合Nexus私服
  19. 性能篇 | 17 | jmeter | BeanShell内置变量prev的使用技巧
  20. 智能摄像头为什么受到这么多人青睐?米家、智汀带你了解一下

热门文章

  1. vray学习笔记(4)混合材质是个什么东西
  2. 360、美团、快手等公司携手智源研究院共建AI开放实验室
  3. 你知道吗,千匹马力电动超跑Rimac Concept One竟然是由SolidWorks设计的!
  4. 电路仿真软件详谈(24),基于proteus电路仿真软件的电压表印刷电路板设计
  5. 系统设计师之路·第一节·Coder Or Designer?——我是骄傲的设计师
  6. phantomjs html格式转换工具使用简介
  7. “我把抖音小店当副业,一个星期赚了7000块”:想给有梦想的人提个醒!
  8. 王者荣耀为何不再荣耀?
  9. 点石互动--zac之:SEO教程写作计划
  10. 一个计算机爱好者的不完整回忆(二十一)歪打正着