回溯三步曲
回溯函数终止条件
回溯搜索的遍历过程12345for () { 加入元素; backtracking(···); // 递归 回溯(返回元素);}
回溯函数返回值以及参数
认识回溯算法:回溯算法就是暴力求解的过程,当我们拿到[1,2,3]我们就尝试拿一个1,然后递归自己,再次从[1,2,3]中尝试拿数,1已经拿过了,所以下一步我们拿2,再次递归自己拿数3,这时就满足题目要求了。然后回退3,手里剩下1,2,再回退2,手里剩下1,此时之前已经拿过1,2了,所以这时for循环到了3,我们拿3,再递归自己,只剩下2,就组成了1,3,2
46. 全排列给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入: nums = [1,2,3]输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
第一步,回溯算法的终止条件是什么呢?就是长度和nums数组长度一致时,就说明得到了一个结果。
遍历过程: 就是在数组中找之前没选过的数字,为 ...
简单记录打家劫舍系列的做法
198. 打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 1:
输入:[1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:
输入:[2,7,9,3,1]输出: 12解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。 偷窃到的最高金额 = 2 + 9 + 1 = 12 。
步骤1:确定dp数组及下标的含义
dp[i]表示到达i号房屋能偷的最多钱数
步骤2:确定递推公式
dp[i]要不是因为前一屋被偷过,所以只能 ...
秒杀问题为什么订单表的id不设置成自增:
id规律性太明显:容易被人猜到
单表数据量限制:大量的订单一定会多个表维护,每个表在自增的时候都会从小到大增加,会出现重复id,订单不能有重复id情况
全局ID生成器雪花算法(Snowflake Algorithm)是由 Twitter 开发的一个用于生成全局唯一标识符(GUID)的系统。这个算法能够在分布式系统中生成唯一的、有序的64位整数ID,非常适合需要高频率创建记录的大型在线服务。
雪花算法的结构
雪花ID是一个64位的长整数,从最高位到最低位,分为以下几个部分:
第1位:未使用,由于整数一般是正数,因此最高位是0。
时间戳部分:通常是41位,用来记录时间戳,精确到毫秒。41位时间戳可以使用约69年。
工作机器ID部分:通常分为5位数据中心ID和5位机器ID(也可以根据实际需求调整这两个部分的位数),可以最多支持2^(5+5)=1024个节点。
序列号部分:通常是12位,每个节点在同一毫秒内可以生成4096个ID。
雪花算法的特点
高效性:生成ID的过程完全在内存中进行,相比基于数据库的自增ID,性能非常 ...
缓存穿透缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
解决办法:
缓存空对象当查找的数据在数据库中不存在时,可以将这个非空的空结果缓存起来,并设置较短的过期时间。这样,当再次查询相同的数据时,可以直接从缓存中获取到这个空结果,从而避免对数据库的访问。需要注意的是,这种方法可能需要适当处理缓存的对象,以防止缓存过多无用数据。
优点:实现简单,维护方便缺点:
额外的内存消耗
可能造成短期的不一致
布隆过滤
布隆过滤器是由布尔逊(Burton Howard Bloom)在1970年提出的一种空间效率很高的概率型数据结构,用于测试一个元素是否是一个集合的成员。它的优点是空间和时间效率都非常高,缺点是有一定的误识别率和删除困难。
布隆过滤器的工作原理
初始化:
• 布隆过滤器本质上是一个大型的位数组和几个哈希函数。开始时,位数组中的每一位都被设置为0。
添加元素:
• 当我们要添加一个元素到集合中时,该元素会被哈希函数处理,得到几个哈希值。
• 这些哈希值对应于位数组中的位置,我们将这些位置上的位都设为1。
成员查询 ...
sketchybar_theme项目配置地址:https://github.com/codejaron/sketchybar_theme
由于我的Mac有“刘海”,所以当我打开如IntelliJ IDEA等软件时,菜单栏就会显示很多的应用程序菜单(显示当前活动应用程序的菜单,包括文件、编辑、视图等菜单选项)导致状态菜单(位于菜单栏的右侧,显示系统状态和功能的图标,例如 Wi-Fi 状态、电池电量、时钟、音量控制等)被挡。因为我在状态菜单处使用了iStat Menus,能够及时看到电脑状态,现在被挡住之后我无法再进行观察
所以我在GitHub上找到了sketchybar这个开源项目,使用了里面一些热心大佬提供的插件,并在此基础上进行了改造,最终得到了目前的菜单栏
目前菜单栏的功能:最左侧的苹果图标点击后可显示如下三个选项,第一个是打开系统设置,第二个是打开活动监视器,第三个是锁屏(脚本是通过运行快捷键Control + Command + Q,请注意自己电脑锁屏快捷键是否为当前这个)
左侧菜单栏还有桌面显示,如下图,我现在第一个桌面有vscode、访达和iterm,第二个桌面有arc浏 ...
Java架构
未读MySQL体系结构
连接层
最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
服务层
第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。
引擎层
存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。
存储层
主要是将数据存储在文件系统之上,并完成与存储引擎的交互。
存储引擎InnoDBInnoDB 是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB 是默认的 MySQL 引擎。
特点:
DML 操作遵循 ACID 模型,支持事务
行级锁,提高并发访问性能
支持外键约束,保证数据的完整性和正确性
文件:
xxx.ibd: xxx代表表名,InnoDB 引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、s ...
Java架构
未读通用语法及分类
DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)
DML: 数据操作语言,用来对数据库表中的数据进行增删改
DQL: 数据查询语言,用来查询数据库中表的记录
DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限
DDL(数据定义语言)数据定义语言
数据库操作
查询所有数据库: SHOW DATABASES;
查询当前数据库: SELECT DATABASE();
创建数据库: CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ];
删除数据库: DROP DATABASE [ IF EXISTS ] 数据库名;
使用数据库: USE 数据库名;
注意
推荐用utf8mb4字符集,UTF8字符集长度为3字节,有些符号占4字节,不推荐
表操作
查询当前数据库所有表: SHOW TABLES;
查询表结构: DESC 表名;
查询指定表的建表语句: SHOW CREATE TABLE 表名;
创建表:
1 ...
Ollama这里介绍两种使用llama3的方式
使用GitHub开源的OpenWebUI
尝试自己使用SpringAI
第一种是别人搭建好的,对ollama很适配,可以上传文件、图片、生成图片等等,当然前提是使用了具有其功能的llm第二种是如果想自己创建一个项目,那么需要自己用SpringAI写代码,这里简单罗列出需要写的基础配置文件,及简单的Controller样例
ollama下载ollama官网:https://ollama.com/去ollama官网下载,安装后运行ollama run llama3
ollama运行端口:11434
OpenWebUI用GitHub开源免费的项目作为llama3前端
OpenWebUI官网:https://openwebui.com/
docker 安装docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io ...
递归三部曲做二叉树的题,要走以下三步:
确定单层递归的逻辑:是根左右(前序遍历)还是左根右(中序遍历)、左右根(后序遍历),又或是层序遍历。
确定递归函数的参数和返回值
确定终止条件:在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要结束了,所以如果当前遍历的这个节点是空,就要return了。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849class Solution { /** * 前序遍历 */ public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); preorder(root, res); return res; } private ...
SpringAI学习了一下新出的SpringAI,这里简单的介绍一下SpringAI的使用方法,基本都是调用各个Spring写好的client的call方法,然后再自己设定一下参数。
创建项目时选择
Lombok
Spring Boot DevTools
Spring Web
OpenAl
application.yml配置
12345678spring: application: name: spring-ai-chat ai: openai: api-key: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx base-url: https://api.openai.com/v1/chat/completions # 填你的key转发地址
ChatClientcall方法ChatController代码
call方法直接传入string12345678910111213141516171819@RestController public class ChatControlle ...
