算法和数据结构
伪代码与流程图
逻辑
结构化编程理论
只需求三种句子,就能够标明逻辑。
次序实施句子
句子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]) =>shell脚本编程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 >二分查找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) =>算法导论; {
let temp = a
a = b
b = temp
}算法工程师
swap(numbers[1],numbers[2])
numbappstoreers[1]
和n源码编程器umbers二分查找法[2]
的值原封不动,这是因为a
、b
是简略类型,传参的时分会复制值。而上面正确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)