前端开发算法学习-数据结构-1

近期因为参加面试频繁被问到算法相关内容,现在开始复习一些算法知识,顺便做些整理供其他想学习算法又不知道从何入手的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;
    };
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值