算法和数据结构

伪代码与流程图

逻辑

结构化编程理论

只需求三种句子,就能够标明逻辑。

次序实施句子
句子1
句子2

算法和数据结构

条件实施句子
if ... then ... else ...算法
if ... else if ... else

算法和数据结构

循环句子
while ... do ...
fo源码同享网r i from 1 to算法的三种根本结构app设备下载 n ...

算法和数据结构

流程图、伪代码的长二分查找法最坏情况下比较次数

操练大脑

有必要自己画出来,不能运行在计算机里。

拾掇思路

思路乱,则图乱。伪代源码编辑器编程猫下载码写欠好,shell指令代码更写欠好。

用流程图找到N个数中的appointment最大数

算法和数据结构

数据结算法的时刻复杂度取决于

数据结构就shell脚本根本指令是数据与数据之间的联络和结构。

appear据结构 = 数据方法 + 操作

不同方法的数据露出不同的操作

怎样标明两个算法的有穷性是指数据

假定次序有意义

[x,y]标源码码头明榜首个是x,第二个是y

[y,x]标明榜首个是y,第二个是x

比方坐标便是这样的数据

要供给first和last操作

假定次序appreciate无意义

(x,y)二分查找算法举例说明和(y,x)相同

比方血压值(1二分查找时刻复杂度20,80)和(80,120)没区别

不需求供给first和aapp安装下载ppearancelast操作

怎样标二分查找法最坏情况下比较次数明N个数据

假定次序有意义

数组标明[a算法的时刻复杂度是指什么1,a2,.shell是什么意思中文..,aN]

要供给索引操作get(i)

要供给 add / indexOf /算法的三种根柢结构 delete 操作

假定次序没意义shelly-lan

调集标明{a1,a2,…,aN}

要供给 add / delete / has 操作算法的三种根本结构

怎样标明N对N数据

比方学号

哈希表标明

hash = {1001 =>appointmen算法的时刻复杂度是指什么t ‘小方’,1002 => ‘小红’}

留意了,和JS不同的是,JS的参数只shell指令能是字符串,而这儿可所以数字、字符串、方针等等。

面试题:

有一段英文对白,里边只会呈现a-z、A-Z、标点符号和空格,请告诉我每个字符呈现的次数。

例如 Hi,I'm R源码共享网iver,输出v呈现1次,R呈现1次,r呈现1次…

str = `Hi,I'm River`
hash = {}
for i from 0 to str.length-1
key = str.get(i)
valu源码e = hash.get(k算法的时刻复杂度取决于ey,0) + 1
hash.set(key,val源码编辑器手机版下载ue)
for key,value from hash
prin算法的五个特性t `$approve{key} 呈现了 ${valshe二分查找法ll编程ue} 次`

数据结构的作用

提前记住一些结构

这些结构很常算法剖析的意图是见,能让你快速理清思路,面试常常问

shelly习笼统才干

一种数据结构往算法导论往能处理许多相似的问题,假定你选错了数据结源码编辑器手机版下载构,根柢想不出思算法的五个特性

排序算法

挑选排序

selection sor二分查找代码t

求最小值

找出两个数中最小的那个
代码
let minOf2 = (number算法导论s) =&gapprovet; {
if(numbers[0] < numbers[1]){算法剖析的意图是
return numbers[0]
}else{
retu算法的有穷性是指rn numbers[1]
}
}
优化代码
l源码年代et min源码网站Of2 = nu算法剖析的意图是mbers =>
numbers[0] < numbers[1]
? numbers[0] : numbers[1]
再优化代源码同享网
let minOf算法导论2 = ([a,b]) => a < b ? a : b

这种写法叫算法是什么析构赋值

调用
minOf2shell是什么意思中文([1,2])	//小白调用法
minOf2.call(null,[1,2]源码码头)	//高手调用法二分查找算法c语言
现成API
JS内置了 Math.min
Mashell脚本th.min(1,2)	//1
Math.min.call(null,1,2)
Math.min.apply(null,[1,2])
关于Math

看起来Math像Object相同是结构函数,实践上Math仅仅一个一般方针。

首字母大写是结构shell是什么意思中文函数,这是仅有特例。

找出三个数二分查找java中最小的那个
代码
let minOf3 = ([a,b,c]) =&gtshell脚本编程100例; {
r二分查找c言语eturn minOf2([minOfappointment2([a,b]),c])
}

或许

letshell脚本根本指令 minOf3 = ([a,b,c]) => {
return算法的三种根柢算法结构 minOf2([a,minOf2([b,c])])
}shell脚本根柢指令
找出四个数中最小shell脚本编程100例的那个
代码
let minOf4二分查找 = ([a,b,c,d]) => {
retu算法是什么rn minOf2([a,minOf3([b,c,d])])
}

恣意长度数组求最小值,都能够经过 minOf2 结束

求恣意长度数组最小算法的时刻复杂度取决于
代码
let mi算法的有穷性是指n = (napplicationumbers) => {
return m源码编辑器编程猫下载in(
[numbers[0],min(numbers.slice(1))]
)
}APP	//代码会死循二分查找法例题环,需增加连续条件
let min = (num算法工程师bers) => {
if(numbers.len源码编辑器编程猫下载gth > 2){
return mshell脚本根柢指令in(
[numbers[0],min(numbeappreciaters.slice(1))]
)
}else{
r算法的时刻复杂度取决于eturn Math.min.apply(null,numbers)
}
}	//这便是递归

用递归结束

递归
特征

二分查找算法c言语approve不断调用自己,每次调用的参数略有不同

当满意某个简略条件时,则结束一个简略源码编辑器源码码头的调用

究竟算出效果

了解

能够用代入源码码头法快速了解递归

能够用调用栈快速了解递归

长度为2的数组排序
代码
let sort2 = ([a,b]) => {
if(a < b){
retu算法的有穷性是指rn [a,b]	//这儿的[a,b]和上面的[a,b]算法shell是什么意思中文是两shell脚本编算法的三种根本结构程100例个不同的数组
}else{
return [b,a]
}
}shelly-lan
优化代码
let sort2 = ([a,b]) =>
a < b ? [a,b] : [a,b]
长度为3二分查找java的数组排shell指令
代码
let sort3 = ([a,b,c]) => {
return [mishell指令n([a,b,c]),sort2([二分查找算法???])]
}	//无法将最小值从数组里删掉
改进代码
let soshell指令rt3 = (nushellymbers) => {
let index = min算法的时刻复杂度是指什么Index(numbers)appearance源码之家
let min = numbers算法的五个特性[index]
numbers.splice(index,1源码码头)	//从numbers里删掉min
return [min].coshell是什么意思中文ncat(sort2(numb源码之家ers))
}
minIndex的结束
let minIndex = (numbers) => numbers.indexOf(appearancemin(numbers))
//这是一个取巧的方法,假定有两个相同的数,也只会回来榜首个数的index
长度为4的数组排序
代码
let二分查找算法举例说明 sort4 = (numbers) => {
let index算法的有穷性是指分查找时刻复杂度 = minIndex(numbers)
let min = numbers[index]
numbers.splice(index,1approach)算法是什么
reappearancapplicationeturn [min].concat(二分查找法最坏情源码编程器况下比较次数so算法设计与剖析rt3(numbers))
}
长度为N的appearance数组排序
源码编辑器编程猫下载
let sort = (numbers) => {
if(numbers.length > 2){
let index = minIndex(numb源码码头ers)二分查找算算法的时刻复杂度取决于法c言语
le源码本钱t min = numbers[in二分查找法dex]
numbers算法剖析的意图是.applesplice(index,1)
return [min].concat(sort(numbers))
}源码编辑器编程猫下载else{
return nshell英语怎么读umbers[0] &l算法是什么t; numbers[1] ? numbShellers : num二分查找算法bers.reverse源码之家()算法工程师
}
}

用循环结束

miAPPnIndex

永久都有两种写法:“递归”和“循二分查找算法算法c言语环”

重写minIndex

现在的mi算法工程师nIndex:

let二分查找算法c言语 mishell是什么意思中文nIndex = (numbers) => {
numbers.indexOf(min(numbers))
}
let min = (nu二分查找javambapproveers) => {
return min(
[numbers[0],mi源码本钱n(numbers.slice(1))]
)
}

二分查找算法写minIndex:

let minIndex = (numbers) => {
let index = 0
for(let i = 1; i < numbers.l二分查找算法c语言ength; i二分查找法++){
if(numbersappearance[iappear] < numbe源码编辑器rs[index]){
index = i
}
}
return index
}app设备下载
重写so源码编辑器手机版下载rt

源码Shell源码编程器在的sort:

le二分查找法最坏情况下比较二分查找java源码共享网t sort = (number二分查找法例题s) => {sshell脚本编程100例h源码之家e算法导论ll编程
if(numbers.length &gt二分查找java; 2){
let index = minIndex(numbers)
let min = numbers[index]
numbers.splice(index,1)
return [min].concat(sort(numbers))
}else{
return numbers[0] < numbers[1] ? numbers :二分查找时刻复杂度 numbers.rever算法设计与剖析se()
}
}

重写sort:

let sort = (numb二分查找法例题ers) => {
for(let i = 0; i < ???; i++){
le源码t index = minIndex算法剖析的意图是(numbers)
//index是其时最小数的下标,index对应的数应当放到i处
swap(numbers, ind源码编辑器手机版下载ex, i)
}
}

结束swap

let swap = (array, i ,j) => {
let temp = array[i]二分查找java
array[i] = a源码之家rray[j]
arshell脚本编程100例ray[j] = temp
}
swap(numbers,1,2)

差错地源码共享网结束swappearap:

let swap = (a,b) =&gt算法导论; {
let temp = a
a = b
b = temp
}算法工程师
swap(numbers[1],numbers[2])

numbappstoreers[1]n源码编程器umbers二分查找法[2]的值原封不动,这是因为ab是简略类型,传参的时分会复制值。而上面正确swap写法,numbers是方针,传参复制地址。

那么???是什么呢?

假定numbers的长度n=4,那么比较只需求进行到i=2就能够,所以上面代码???补偿为numbers.length-1

算法和数据结构

minIndex查找规划有问题

let index = minIndex(numbersshelly-lan)这句话有问题,假定前次循环现已找到了榜首个shelly最小的数字,那么之后找最小数字之时,就要忽略榜首个数字。

l源码本钱et index = minIndexappear(numbers算法工程师.slice算法的三种根柢结构(i)) + i

算法和数据结构

后边+i,因为假定不加,那么index总是从0数起,splic算法导论e减去了i,需求再后边补上i,这样index才调对应正确的minIndex

究竟代码

let sort = (numbers) => {
for(let i = 0; i < numbers.length -算法的时刻复杂度取决于 1; i二分查找java++){
console.log(`----二分查找java`)
conso二分查找javale.log(`i: ${i}`)
let index = m算法剖析的意图是inIndex(numbers.slice(i)) + i
console.log(`iAPPndex: ${index}`)
cons算法设计与剖析olappreciatee.log(`m二分查找代码in: ${numbers[index]}`)
if(iappointmentndex !== i){
swap(numbers, i二分查找法例题ndex, i)
console.log(`swap ${index}: ${i}`)
console.log(numbers)
}
}
return numbers
}

补偿函数

let swapproveap = (array, i ,j) => {
let temp = array[i]
array[i] = arappreciateray[j]二分查找代码
array[app安装下载j] = temp
}算法工程师
let minIndex = (numbshell是什么意思中文ers) => {
let index = 0
for(let i = 1; i < numbers.approachl源码年代en源码编辑器编程猫下载gth; i++){
if(numbershell脚本根本指令s[i] < numbers[index]源码年代){
index = i
}
}
return index
}

快速排序

q二分查找算法uick sort

递归思路

以某某为基准二分查找java,小的去前面,大的去后边

只需求重复说这源码网站句话,就能排算法

快排源码

let quickSort = arr => {
if(二分查找法最坏情况下比较次数arr.length <= 1){return arr算法工程师;}
l二分查找时刻复杂度et pivotIndex = Mashell是什么意思中文th.floor(arr.length / 2);	//算法的有穷性是指pivot 中心点二分查找时刻复杂度
let pivot = arr.splice(pivotIndex,1)[0];
let left = [];
let right = [];
for(let i = 0; i < arr.length; i++){
if(arr[i] < pivot){
left.push(arr[i]算法的时刻复杂度算法设计与剖析是指什么)源码编程器
}els源码年代e{
right.push(arr[shellfishi])
}
}
return qshell英语怎么读uiapp设备下载ckSort(left).concat([pShellivot],qu源码之家ickSort(right))
}

归并排序

merge sort

递归思路

不以某某为基准,左面一半排好序,右源码本钱边一半排好序

然后算法剖析的意图是把左右两端合二分查找时刻复杂度并(merge)起来

归并排序源码

let mergeSor二分查找c言语t = arr => {appstore
let k = arr.length
if(k === 1){return arr}shell脚本根柢指令
let left = arr.slice(0,M源码编辑器ath.floor(k/2))
let rightshelly =算法工程师 a二分查找rr.slice(Math.floor(k/2))
ret源码编程器urn merge(mergeSort(left),mergeSort(right))
}二分查找代码
let merge = (a,b) =&g算法导论t; {
if(a.length === 0) retu源码码头rn b
if(b.lengthshellfish === 0) return a
return a[0] > b[0]
? [b[0]].concat(merge(a,b.slice(1)))
: [approacha[0]].concat(m算法剖析的意图是erge(a.二分查找算法slice(二分查找1),b))
}

计数排序

counting sort

appointment归思路

用一个哈希表作记载

发现数字N就记为N: 1,假定再次发现N算法的五源码共享网个特性就加1

究竟把哈希表的key悉数打印,假定N: m算法的时刻复杂度取决于,那么N需求打印m次

记载数组的一算法剖析的意图是同,也会记载一个max,遍历shelly后会从小到大依次打印出来。

计数排序源appearance

let countSort = arr => {
let hashTable =源码本钱{}, max = 0, result = []
f算法设计与剖析or(let i = 0; i < arr.length; i++)源码{	//遍历数组shel源码网站l编程
if(!(arr[i] in hashappearTable算法是什么)){
hashTable[a二分查找javarr[i源码年代]] = 1
}e二分查找时刻复杂度lse{
hasshell指令hTable[arr[i]] += 1
}源码年代
if(arr[i] > maxShell){max = arr[ishell编程]}
}
for(let j = 0; j <= max; j++)二分查找代码{	//遍历哈希表
i算法的approach有穷性是指f(j in hashTable){
for(二分查找法例题let ishell脚本根柢指令 = 0; i < ha算法工程师shTableappointment[j]; i++){
result.push(j源码编辑器)
}
}
}
return result
}

计数排二分查找法最坏情况下比较次数序的特征

数据结构不同

运用shell是什么意思中文了额定的hashTable

只遍历数组一遍(不过还要遍历依次hashTable

这便是“用空间换时刻”

时刻复杂度比照

挑选排序O(n^2)

快速排序算法的时刻复杂度是指什么O(n log2 n)

归并排序O(n log2 n)

计数排序appreciateO(n + max),最少

其他排序

冒泡排序

插入排序

二分查找击 INS

希尔排序

挑选Shell Sort

基数排算法导论

点击RA算法的三种根本结构D

7.3 数据结构

部队&栈

部队 Queue

先进先出 FIFO 的数算法工程师

标题

请结束一个餐厅叫号网页,点击算法的三种根柢结构“取号”按钮生二分查找算法成一个号码,点击“叫号shell是什么意思中文”按钮闪shelly-lan现“请X号就餐”源码本钱

代码算法导论

queueapprecia源码之家te.算法导论push为入队

queue.shi算法导论ft为出队

算法和数据结构

算法和数据结构

算法和数据结构

栈 Stack

后进先出 LIFO 的数组算法工程师

举例

JS函数的调用栈cal算法的五个特性l stack便是一个栈

假定f1shell脚本调用了f2,f2又调用了f3

那么f3结束后应该回到f2,f2结束后应该回到f1

代码
function f1(){let a = 1; retshell脚本u算法工程师rn a + f2()}
function f2(){let b = 2; return b + f3()}
function f3(){let c = 3; return c}
f1()

算法和数据结构

链表 Linked List

queue-d源码编辑器编程猫下载emo-1

一个链一个

算法和数据结构

实践运用

let array = [1,2,3]
array.__protoShell_源码共享网_ ===二分查找 Array.prototype
Array.prototype.__proto__ === Obj算法的三种根柢结构ect.shell英语怎么读protot算法是什么ype

从这个角度看,方针便是链表——算法的五个特性

算法和数据结构

代码

list = create(value)
node = g算法的时刻复杂度取决于et(index)
append(node,value)
remove(node)
travel(list,fnappointment)

链表的变形

算法的时刻复杂度取决于向链表

每个节点有一个previous指向上一个节点

循环链表

究竟一个节点appreciate的nextapprove指向头节点

哈希表 key-value pshell指令airs

场景

假定哈希表hash里有一万对key-value,比shell脚本根柢指令name: 'River', age: 18, p1: 'property二分查找法例题'...

怎样使得读取hash['xxx']速度最快

处理方appointment

不做任何优化,二分查找时刻复appear杂度hash['xxx']需求遍shellfish历悉数key,O(n)

对keyapple排序,运用二分查找,O(log2 n算法的时刻复杂度是指什么)

用字二分查找源码编程器算法符串对应的ASCII数字做索引,O(1)

对索引做除法取余数,O(1)抵触了就顺延

树 Tree

算法和数据结构

实践运用

我国的省市区,能够当作一棵树

公司的层级结shell脚本根本指令构,能够当作二分查找算法c语言一棵树

网页中的节点,能够当作一棵树

代码

let二分查找java tree = createapprec算法设计与剖析iateTre源码码头e(value)
let node = createNode(value)
addChild(tree,nshell脚shell脚本编程100例本根柢指令ode)
removeChild(node1,源码编辑器node2)
travel(shell脚本tree)