ElasticSearch 进阶
ES使用场景
全文搜索
日志检索,配合Kibana可视化
商品搜索
实时监控
个性化推荐,根据用户搜索历史、浏览行为找出相似内容
地理位置搜索(外卖系统)
智能提示/提示词
🔵 MySQL不能替代ES,因为:
MySQL做全文检索很弱(like %xxx% 查询超级慢)
MySQL不擅长复杂聚合分析(特别是大数据量)
MySQL无法做到灵活的多字段模糊搜索、地理位置搜索、同义词处理
🔵 ES不能替代MySQL,因为:
ES写一致性弱,不支持多表事务(比如扣库存和扣余额一起回滚)
ES不保证强一致性(默认最终一致性,适合搜索,不适合资金类应用)
ES的数据模型松散,复杂关系建模很痛苦(比如订单拆分、子表操作)
什么是ElasticSearch?简单来说,ES是一个分布式的、基于文档的 搜索引擎+数据库系统
分布式: 天然支持分布式/集群、扩展节点
文档存储: 数据并不是以行或者列进行存储,而是一份份JSON文档
聚合分析(数值型字段)会单独存储到Doc values中,列式存储(加速聚合分析,且无冗余字段,比MySQL ...
代码随想录:回溯算法
[TOC]
回溯算法
本质还是暴力搜索,但是可以利用剪枝进行优化
77. CombinationsGiven two integers n and k, return all possible combinations of k numbers chosen from the range [1, n].
You may return the answer in any order.
Example 1:
Input: n = 4, k = 2Output: [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]Explanation: There are 4 choose 2 = 6 total combinations.Note that combinations are unordered, i.e., [1,2] and [2,1] are considered to be the same combination.
Example 2:
Input: n = 1, k = 1Output: [[1]]Explanation: There is 1 cho ...
代码随想录:二叉树
二叉树[TOC]
101. Symmetric TreeGiven the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center).
Example 1:
Input: root = [1,2,2,3,4,4,3]Output: true
Example 2:
Input: root = [1,2,2,null,3,null,3]Output: false
Constraints:
The number of nodes in the tree is in the range [1, 1000].
-100 <= Node.val <= 100
Follow up: Could you solve it both recursively and iteratively?
Yes ! I can
recursively
比较是否对称可以细化为,比较根节点的左右孩子,以及比较左孩子的左孩子跟右孩子的右孩子和左孩子的右孩 ...
代码随想录:栈和队列
[TOC]
栈和队列
一开始小登自己认为,栈和队列不就是特殊一点的数组嘛,就是闭合了一端的数组。还不能通过下标索引进行检索(这个时候完全没想到,栈和队列里面的元素存储并不是连续的内存)
225. Implement Stack using QueuesImplement a last-in-first-out (LIFO) stack using only two queues. The implemented stack should support all the functions of a normal stack (push, top, pop, and empty).
Implement the MyStack class:
void push(int x) Pushes element x to the top of the stack.
int pop() Removes the element on the top of the stack and returns it.
int top() Returns the element on the top of th ...
无题
��ࡱ�>�� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ...
贪心算法
[TOC]
贪心算法455. Assign CookiesAssume you are an awesome parent and want to give your children some cookies. But, you should give each child at most one cookie.
Each child i has a greed factor g[i], which is the minimum size of a cookie that the child will be content with; and each cookie j has a size s[j]. If s[j] >= g[i], we can assign the cookie j to the child i, and the child i will be content. Your goal is to maximize the number of your content children and output the maximum number.
Examp ...
RabbitMQ learn
RabbitMQ相关介绍最好的学习文档: RabbitMQ 教程 - “Hello World!” |RabbitMQ 函数 — RabbitMQ tutorial - “Hello World!” | RabbitMQ
什么是消息队列 & 为什么使用?
Message Queue
顾名思义,存储消息的队列。
先来说说一个场景,以前送外卖的话或者送快递之类的,都是点到点,也就是快递小哥会直接送到你家,要是敲门发现不在,给你打个电话,此时你好像不得不回去?
其实先不说菜鸟驿站或者外卖柜。你们家家门口那块地就勉强算得上消息队列了,只不过不能保证安全,其他人也可以消费(bushi)
快递小哥只需要把快递放到你家门口,然后通过软件或者发短信,提醒你,就可以去干自己的事情了。而且你也不用马上去处理这个快递而打断当下做的事情。
什么是消息队列MQ全称为Message Queue,即消息队列。“消息队列”是在消息的传输过程中保存消息的容器。它是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接 ...
代码随想录:哈希表
代码随想录-哈希表篇在大学或者其他时候学习数据结构课程时。不难发现,算法发展都是由于对时间或者空间有较高的需求,从而一步步优化。在查询优化时,到二分法( log(N) )时,开始出现了瓶颈, 如何降到O(1)或者退而求其次追求O(2),O(3)呢?
在顺序查找和二分查找时,我们都是索引+关键字存储,那能不能直接使用关键字充当索引,那不就能直接O(1)了吗?
哈希表就是怎么个思想(个人这样想的)
要深入学习的话,可以考虑由这些方面入手:空间开辟大小、哈希函数(存储)、解决哈希冲突、底层原理等。
嘛,这里主要是入门一下,通过做题感受一下
242.有效的字母异位词力扣题目链接(opens new window)
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true
示例 2: 输入: s = “rat”, t = “car” 输出: false
这个题目给出的都是小写字母,所以在用go写的方法里面就更简单一些。额也因为Jav ...
代码随想录:链表
[TOC]
代码随想录—链表嗨嗨,越是到了期末周,越是想开摆。复习什么的,60分万岁吧。有些东西真不感兴趣了。
这次是来到了链表篇(毕竟链表和数组在数据结构中很是重要)
这里我基本都是使用的迭代法(递归法得慢慢修炼修炼再考虑了)
(从大一c语言学习的时候,就觉得大多数情况下都能约定好使用的是虚拟头结点就好了)
所以推荐使用链表时都使用一个虚拟头结点(力扣人好像喜欢叫哑结点)
偶尔的话可以使用哨兵结点,用于减少判断条件或者越界
先大概概括一下基本题型吧
链表的建立以及增删查改
虚拟头结点的使用,temp临时指针等
边界条件判断(什么时候使用current !=null 什么时候使用current.Next !=null)
拓展: 双向链表,循环链表(记得试试约瑟夫环这个经典问题)
反转链表
原地反转(注意使用指针保存下一个结点)
新建头结点然后使用头插
删除链表倒数第N个结点
直接暴力,第一次先算链表长度,第二次遍历删除该结点
使用前后指针,先让快指针走N步,然后慢指针开始出发。
判断是否有环
让你判断是否有环
快慢指针
哈希表
寻找环的入口
快慢 ...
代码随想录:数组篇
[TOC]
数组篇总结首先跟着代码随想录刷了一刷,大概接触到题型有二分法、移除元素/排序、滑动窗口、模拟行为
二分法
确定好左右边界,以及mid的变化就好
移除元素
for循环暴力!
快慢指针: 快指针去探索找寻符合条件的宝藏,然后交给慢指针
使用堆栈或者队列
排序
首尾双指针
滑动窗口
双层for循环暴力! 其实这种也是滑动窗口,只是完全是无脑滑动(以边界条件为条件)
双指针滑动,两个for循环(上面是n*n,这个是2n),且移动条件为场景需求条件(使用hashmap进行维护)
模拟行为
害。。听天由命,画图吧。
可能这里更多的是用go去实现吧,因为go语言我也是刚学,然后语法都不太稳固那种,更别说使用什么api了,所以感觉就是算法和go都拿。有思路但是go很卡壳的话就先用Java写一下然后查go的语法然后用go写
二分法34. 在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [ ...