LeetCode 组队刷题活动

组队刷 LeetCode

介绍

代码仓库

 代码仓库的坐标:asdf2014 / algorithm

报名途径

 只需要在《Algorithm》文末留言,即可随时参与

留言内容的话,至少要留一下自己的 Github 名称,方便我们这边统计汇总。另外,也可以说明下自己能接受的刷题频率、希望的选题策略,亦或者,对算法知识沉淀的模式有好的建议,都可以提出

参与方式

 每位参与的小伙伴,都会获得代码仓库的 Collaborator 权限,可以自由地提交代码(不限制语种)。在 /Codes/${User} 目录下,每人都将拥有一个自己的代码库。留下 Github 名称后,将很快会收到邀请函,大家可以在 asdf2014 - algorithm - invitations 链接中认领

1
2
# 一键完成您的第一次代码提交
bash -c "$(curl -L https://raw.githubusercontent.com/asdf2014/algorithm/master/first_commit.sh)"

刷题频率

 考虑到可能大家的闲暇时间并不多,我们暂定刷题频率为“一周一题”

选题策略

 分为两个阶段:

  • 前 100 题都是经典中的经典,所以我们第一阶段先将这些题目吃透
  • 第二阶段,通过程序进行随机选定,历史题库可以点击链接看到

其他

 操作 Git 时遇到问题的话,可以参考我的一篇博客《Git 高级玩法

也可以直接在文章最后留言。目前,支持 Gitalk + Disqus 两种留言系统,以便更好地服务于国内和海外的小伙伴

 同时,为了大家更加方便地交流,也欢迎加入算法 QQ 群 或者 Gitter 聊天室

但是,请不要在评论区讨论入群问题的答案,避免打广告的进入

 另外,因为大部分算法都会有很多实现思路,我们会尽可能地展现所有可能的解题方法。但为了文章的排版更加地紧凑,我们会将同一算法的不同实现,通过选项卡的形式展现。且默认展示的选项卡将会是最优解。这样的话,如果您想要快速阅读本文,则可以不用翻看其他的选项卡。实际效果如下:

迭代解

1
2
3
4
5
6
7
8
9
10
11
def solution(n):
if n <= 1:
return n
a = 0
b = 1
while n > 1:
n = n - 1
sum_ = a + b
a = b
b = sum_
return b

递归解

1
2
3
4
5
def solution(n):
if n <= 1:
return n
else:
return solution(n - 1) + solution(n - 2)

动态规划解

1
2
3
4
5
6
7
8
def solution(n):
if n <= 1:
return n
cache = [x for x in range(0, n + 1)]
cache[1] = 1
for i in range(2, n + 1):
cache[i] = cache[i - 1] + cache[i - 2]
return cache[n]
阅读全文 »

ElasticSearch 是什么?

 ElasticSearch™ 是一款基于 Lucene 的搜索引擎,不但稳定、可靠、快速,同时具备良好的水平扩展能力

特性

  • 功能丰富,且开箱即用
  • 横向可扩展性
  • 分片机制更好地解决热点问题
  • 多副本有效保证了高可用
  • 精确的熔断器机制
  • 社区庞大,生态完善

主要概念

Cluster 集群

 在一个分布式系统里面,可以通过多个 ElasticSearch 节点组成一个集群。集群中会动态选举出一个主节点,保证了 ElasticSearch 集群不存在单点故障
 在同一子网内,只需要将进程设置为相同的集群名,ElasticSearch 就会把这些集群名相同的进程自动组成一个集群。集群中各节点间的通讯和数据负载均衡,全部都由 ElasticSearch 自动管理

Node 节点

 每一个 ElasticSearch 进程称为一个 Node 节点。在测试环境中,可以在一台服务器上运行多个 ElasticSearch 进程;但生产环境中,则建议每台服务器只运行一个 ElasticSearch 进程

Index 索引

 ElasticSearch 中的索引是文档数据存储的地方,相当于是传统关系数据库中的 DataBase 概念。更多逻辑上的对应关系,如下表所示:

Relational DB HBase ElasticSearch 说明
Database NameSpace Template 一组索引的模板配置
Table Table Index 索引
Row RowKey Document 文档,和 Lucene 概念一致
Column + Value Cell Field 如果将文档理解为 JSON,那么 Field 就是字段和值
- - Term 检索的基本单位,相当于是文本中的一个词
- - Token Term 内容、类型,以及 Term 在文本中的起始及偏移
目前最新的 ElasticSearch 7.x 版本里面已经废弃了 Type 的概念
阅读全文 »

Welcome

 Welcome to My Blog!

博客介绍

 吾生有涯而学无涯,以有涯而逐无涯(有点断章取义,不过追寻知识的热情是必要的)

大事件纪实

标题 内容 日期
混沌初开 建站第一天 2014-11-01
模糊的记忆 Hexo 框架 / next 主题 / 七牛图床 / Gulp 压缩 / 静态资源 CDN / 支持 MathJax 2014~2016
多说关闭 评论系统切换为 Disqus 2017-04-10
Order by Update 文章以最后更新时间倒排展示(避免养成隔一段时间水一篇的坏习惯) 2017-04-22
Aliyun 备案 苏 ICP 2017-05-25
全站 HTTPS TrustAsia 域名证书 2017-10-10
Coding.net 静态页面从 github.io 切换为 coding.net(香港服务器) 2017-11-15
不蒜子 502 页面统计切换为 Lean Cloud,之前的 PV / UV 统计无奈清零 2017-11-19
DDoS 攻击解除 回归不蒜子 2017-11-20
Gitment 延迟加载 Gitment 2018-05-29
回归 Github Page Github Page 开始支持 HTTPS 2019-04-20
全站 CDN 阿里云 DCDN 2019-04-21
简繁切换 支持简体与繁体切换 2019-04-27
支持 Gitalk Gitment 验证存在跨域问题,而 Gitalk 可以无缝迁移 2019-05-01
支持 DaoVoice 可以匿名留言,在线沟通 2019-05-02
暂闭 DaoVoice 出于其服务稳定性的考量,暂时关闭 2019-05-11
设计 Logo 新 Logo 寓意着浩瀚宇宙中的一处安心的港湾 2019-05-11
源站迁移 全站迁移至阿里云 OSS,代替 Github Page 作为源站 2020–01-01
阅读全文 »

基本概念

 Superset 是 Airbnb 开源的一个旨在视觉,直观和交互式的数据探索平台(曾用名 Panoramix、Caravel,现已进入 Apache 孵化器)

基础组件

Flask

 Python 几大著名 Web 框架之一,以其轻量级, 高可扩展性而著名

  • Jinja2
    模板引擎

  • Werkzeug
    WSGI 工具集

Gunicorn

 Gunicorn 是一个开源的 Python WSGI HTTP 服务器,移植于 Ruby 的 Unicorn 项目的采用 pre-fork 模式的服务器

WSGI

 WSGI,即 Python Web Server Gateway Interface,是专门用于 Python 应用程序或框架与 Web 服务器之间的一种接口,没有官方的实现,因为 WSGI 更像一个协议,只要遵照这些协议,WSGI 应用都可以在 任何服务器上运行,反之亦然

Pre-Fork

 一个进程处理一个请求,基于 select 模型,所以最多一次创建 1024 个进程
 预先创建进程,pre-fork 采用的是预派生子进程方式,用子进程处理不同的请求,每个请求对应一个子进程,进程之间是彼此独立的
 一定程度上加快了进程的响应速度

阅读全文 »

关于本文

 虽然接触 Java 已经 8 年之久,可惜学习之初的笔记文档没能很好地保存下来。本文是近几年工作学习中遇到的一些零散的知识点,包括了 基础概念、实用的编程技巧、代码可读性、设计模式、性能优化(工具 & 编码)、测试相关、JVM 相关、常用的工具和常见问题。本着好记性不如烂笔头的初衷,在不断地踩坑和爬坑的过程中,慢慢地记录成文。期待着本文能起到抛砖引玉的作用,以看到大家的真知灼见。

基础知识

注解

GuardedBy

 @GuardedBy 注解可以作用于某一个属性或者方法,约定在访问这些被注解标记的资源时,能被同步代码块保护着。简单的使用案例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@GuardedBy("obj")
private ConcurrentMap<String, String> map = new ConcurrentHashMap<>();
private final Object obj = new Object();

public void put(String k, String v) {
synchronized (obj) {
map.put(k, v);
}
}

/**
* If you use `error prone` tool to check this, this annotation should be `@SuppressWarnings("GuardedBy")`
* {@see https://errorprone.info/bugpattern/GuardedBy}
* {@see https://github.com/apache/incubator-druid/pull/6868#discussion_r249639199}
*/
@SuppressWarnings("FieldAccessNotGuarded")
public void remove(String k) {
map.remove(k);
}

@Override
public String toString() {
synchronized (obj) {
return "GuardedByExample{" +
"map=" + map +
'}';
}
}

Tips: Code Example from Apache Druid;另外,error-prone 工具支持对多种版本@GuardedBy 进行检查

阅读全文 »