当前位置: 首页 > article >正文

算法关键知识汇总

最近刷题的时候,会遇到定义Map,Set,二维数组等,还有深度/广度优先...等等,一开始对于这些的代码编写非常生疏,有想法但就是下不了笔,因此,想针对这方面的知识进行总结。

Map

Map 是一种键值对存储的数据结构,相比于普通对象 {},它允许任何类型的键

let map = new Map();

// 添加元素
map.set('name', 'Alice');
map.set(1, 'Number Key');
map.set(true, 'Boolean Key');

// 获取元素
console.log(map.get('name')); // Alice
console.log(map.get(1)); // Number Key

// 删除元素
map.delete(1);

// 遍历
for (let [key, value] of map) {
    console.log(key, value);
}

常见方法:

  • set(key, value): 添加键值对

  • get(key): 获取值

  • delete(key): 删除键值对

  • has(key): 判断是否包含某个键

  • size: 获取元素数量

  • clear(): 清空 Map

Set

Set不重复值集合

let set = new Set();

// 添加元素
set.add(1);
set.add(2);
set.add(2); // 不会重复添加

// 检查是否存在
console.log(set.has(2)); // true

// 删除元素
set.delete(1);

// 遍历
for (let value of set) {
    console.log(value);
}

常见方法:

  • add(value): 添加元素

  • delete(value): 删除元素

  • has(value): 判断元素是否存在

  • size: 获取元素个数

  • clear(): 清空 Set

二维数组

二维数组是数组的数组,常用于表示矩阵或棋盘等结构,一般题目的输入格式是:

['abcd', 'efgh', 'ijkl']

我们定义这个数组是charMatrix,首先确定行数和列数,也就是:

let row = charMatrix.length;
let col = charMatrix[0].length;

这时候我们要定义一个二维数组:

let charList = new Array();

for(let i = 0; i < row; i++) {
    charList[i] = new Array();
            
    for(let j = 0; j < col; j++) {
        charList[i][j] = 0;
    }
}

可以简化代码:

let charList = new Array(row);

for(let i = 0; i < charList.length; i++) {
    charList[i] = new Array(col).fill(0);
}

广度优先搜索

广度优先搜索(Breadth First Search, BFS)通常使用队列进行层级遍历

function bfs(matrix, startX, startY) {
    let queue = [[startX, startY]];
    let visited = new Set();
    visited.add(`${startX},${startY}`);

    while (queue.length > 0) {
        let [x, y] = queue.shift();
        console.log(matrix[x][y]);
        
        // 遍历四个方向
        let directions = [[1, 0], [-1, 0], [0, 1], [0, -1]];
        for (let [dx, dy] of directions) {
            let newX = x + dx, newY = y + dy;
            let key = `${newX},${newY}`;
            
            if (newX >= 0 && newY >= 0 && newX < matrix.length && newY < matrix[0].length && !visited.has(key)) {
                queue.push([newX, newY]);
                visited.add(key);
            }
        }
    }
}

深度优先搜索

深度优先搜索(Depth First Search, DFS)是一种递归或使用栈的搜索方式

1.递归实现

function dfs(matrix, i, j, visited) {
    if (i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length || visited[i][j]) {
        return;
    }
    visited[i][j] = true;
    
    // 递归搜索四个方向
    dfs(matrix, i + 1, j, visited);
    dfs(matrix, i - 1, j, visited);
    dfs(matrix, i, j + 1, visited);
    dfs(matrix, i, j - 1, visited);
}

2.栈实现

function dfsStack(matrix, startX, startY) {
    let stack = [[startX, startY]];
    let visited = new Set();
    
    while (stack.length > 0) {
        let [x, y] = stack.pop();
        let key = `${x},${y}`;
        
        if (visited.has(key)) continue;
        visited.add(key);
        
        // 处理当前节点
        console.log(matrix[x][y]);
        
        // 加入相邻节点(上下左右)
        let directions = [[1, 0], [-1, 0], [0, 1], [0, -1]];
        for (let [dx, dy] of directions) {
            let newX = x + dx, newY = y + dy;
            if (newX >= 0 && newY >= 0 && newX < matrix.length && newY < matrix[0].length) {
                stack.push([newX, newY]);
            }
        }
    }
}

http://www.kler.cn/a/599723.html

相关文章:

  • 人工智能笔记
  • 浅谈:《嵌入式软件中的那些数据结构》
  • 算法刷题整理合集(七)·【算法赛】
  • 深入理解 tree 命令行工具:目录结构可视化的利器
  • Elasticsearch 倒排索引 和 正排索引
  • python全栈-前端
  • 人工智能AI术语
  • Spring Boot(十五):集成Knife4j
  • 【redis】哨兵:人工恢复主节点故障和哨兵自动恢复主节点故障
  • 信号相关的程序
  • ResNet与注意力机制:深度学习中的强强联合
  • MySQL: 创建两个关联的表,用联表sql创建一个新表
  • SpringBoot+策略模式+枚举类,优雅消除if-else
  • Oracle归档配置及检查
  • vue3动态绑定并通过按钮绑定事件 | 解决报错error ‘xxx‘ is not defined no-undef
  • istio 介绍-01-一个用于连接、管理和保护微服务的开放平台 概览
  • uniapp笔记-swiper组件实现轮播图
  • python 实现一个简单的window 任务管理器
  • python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测
  • 常见的表单元素