近期因为参加面试频繁被问到算法相关内容,现在开始复习一些算法知识,顺便做些整理供其他想学习算法又不知道从何入手的FE参考学习!尤其针对非科班出身的FE同学~
核心内容:前端开发工程师必须了解的一些算法基础。
算法的核心是编程思想,计算机语言只是一种工具,网上绝大部分算法都是利用C/C++/python去实现一些算法,javascript实现的较少,此次算法基础学习都是基于javascript实现,在实现过程中巩固js基础api的使用。掌握编程思想是核心!
【大纲如下】
数据结构
-
栈
-
队列 - 优先队列
-
链表 - 双向链表 - 循环链表
-
集合 - 子集 - 交集 - 并集 - 差集
-
字典 - 散列表
-
树 - 二叉搜索树 - 自平衡树 - 树遍历
-
图 - 深度优先 - 广度优先 - 最短路径
算法
-
排序算法- 冒泡排序 - 选择排序 - 插入排序 - 归并排序
-
搜索算法- 顺序搜索 - 二分搜索
-
算法模式- 递归 - 动态规划 - 贪心算法
1-1 栈
LIFO 一种后进先出的数据结构
基础概念
入栈、出栈、栈顶、栈底
push 入栈
pop 出栈
peek 查看栈顶
clear 清空栈
isEmpty 检查栈是否为空
size 获取栈长度
// 栈的实现
const Stack = (function () {
let _items = [];
class Stack {
constructor() {
// this.items = _items;
}
peek() {
return _items[_items.length - 1];
}
push(el) {
_items.push(el);
}
pop() {
return _items.pop();
}
isEmpty() {
return !_items.length;
}
size() {
return _items.length;
}
clear() {
_items = [];
}
getItems() {
return _items;
}
}
return Stack;
})();
十进制转二进制
余数法
const ten2two = number => {
let stack = new Stack();
let ys;
let result = '';
while (number > 0) {
ys = number % 2;
stack.push(ys);
number = Math.floor(number / 2);
}
while (!stack.isEmpty()) {
result += stack.pop();
}
return result;
};
栈的作用
在编程语言的编辑器和内存中保存遍历、方法调用。
计算机内存 => 栈结构
函数先调用先入栈,出栈的时候后入先出栈。
1-2 队列
FIFO 先进先出
基础概念
队列 queue
入列 enqueue
出列 dequeue
查看列头 front
是否为空 isEmpty
获取长度 size
const Queue = (() => {
let _items = [];
return class Queue {
enqueue(el) {
_items.push(el);
}
dequeue() {
return _items.shift();
}
font() {
return _items[0];
}
isEmpty() {
return !_items.length;
}
size() {
return _items.length;
}
};
return Queue;
})();
击鼓传花
const chuanhua = (list, number) => {
let queue = new Queue();
list.forEach(el => {
queue.enqueue(el);
});
let taotai;
while (queue.size() > 1) {
for (let i = 0; i < number - 1; i++) {
queue.enqueue(queue.dequeue());
}
taotai = queue.dequeue();
console.log('queue', queue.size());
console.log('淘汰的人:==', taotai);
}
return queue.dequeue();
};
优先队列
正常队列上添加上优先级priority
const PriorityQueue = function () {
let items = [];
// 辅助类
function QueueItem(el, pri) {
this.el = el;
this.priority = pri;
}
this.enqueue = (el, pri) => {
var queueItem = new QueueItem(el, pri);
let added = false;
for (let i = 0; i < items.length; i++) {
if (queueItem.priority > items[i].priority) {
items.splice(i, 0, queueItem);
added = true;
break;
}
}
if (!added) {
items.push(queueItem);
}
};
this.getItems = () => {
return items;
};
};