首页 文章 精选 留言 我的

精选列表

搜索[hard],共872篇文章
优秀的个人博客,低调大师

Learning algorithem the hard way array (part 2)

数组(Array)是一种线性表数据结构。它用一组连续的内存空间来存储一组具有相同数据类型的数据。 上述定义当中有有几个较为关键的概念: 线性表 (Linear List)线性表是指数据排成一个线型的结构。每个线性表上的数据最多只有前后两个方向。 除了数组之外,链表、队列、栈也是线性表结构。而与其对应的概念是非线性表,例如二叉树、图、堆等。连续的内存空间和相同的数据类型数组的随机访问(根据索引下标访问)时间复杂度为 O(1) 。其随机访问的实现原理是: a[i]_address = base_address + i * data_type_size 为什么大部分编程语言的数组下标是从 0 开始设计,而不是从 1 开始?我们来思考另外一个问题,为什么大部分编程语言的数组索引下标是从 0 开始,而不是从 1 开始?如果从 1 开始的话,上述的公式必须转化为: a[i]_address = base_address + ((i - 1) * data_type_size) 对比从 0 开始的方案,需要多做一次减法运算。因此大部分编程语言都选择从 0 开始作为数组的初始下标。 低效的插入和删除操作 插入操作假设数组的长度为 n ,我们需要将新元素 e 插入到数组中的第 k 个位置,那我们需要将后续的 n - k 个元素顺序地往后进行移动,因此在这种场景下插入操作的时间复杂度为 O(n) 。 但是有一种特殊场景下:数组仅仅作为一种容器去存储数据,而不用关心数组中存储元素的顺序,能够将数组插入操作的算法复杂度提升为 O(1) 。 举个例子,假设数据 a[10] 中存储了 5 个元素: a、b、c、d、e 。我们将元素 x 插入到第三个位置,只需要将原有的第三个元素 c 移动到最后,再将第三个元素替换为 x ,具体的实现代码如下: a[5] = c; a[2] = x; 删除操作与插入操作类似,如果我们要删除第 k 个位置的数据,为了内存的连续性,也需要搬移数据,因此数组的删除操作时间复杂度为 O(n) 。 有一种数组删除操作的优化方案是,不需要每一次删除操作时都移动数据,而是先将被删除的索引位置记录下来,等到数组容量不足时,再一次性地从内存当中移除数据,并移动剩余元素的位置。其核心思想与 JVM 的标记清除内存回收算法非常相似。 数组与容器类型的对比 许多编程语言中都提供了高级的容器类型,例如 Java 的 ArrayList , C++ 的 Vector 等,数组与这些高级容器类型相比,有哪些适合的应用场景了? 适合使用容器类型的场景高级容器类型支持动态扩容,适合存储元素的大小无法事先确定的场景。例如 ArrayList 会在存储空间不足时,自动扩容 1.5 倍。需要注意的是,我们应该养成设置 ArrayList 初始容量的习惯,因为这样能够节省掉很多次内存分配空间和数据搬移的操作。 //假设从 db 当中获取用户的数据为 10000条 //指定初始容量为 10000 会比不指定容量获得更好的性能 ArrayList<User> list = new ArrayList<User>(10000); for (int i = 0; i < db.getUserList(); i++) { list.add(db[i]); } 适合使用数组的场景ArrayList 无法存储基本类型:int 、long 等,只能存储包装类型: Integer 、Long ,而 Boxing 和 UnBoxing 会有一定的性能损耗,如果特别关注性能,就可以使用数组。 Java implemention初步实现了类似于 ArrayList 的代码。ref here JDK 1.8 ArrayList 的实现代码。ref here

优秀的个人博客,低调大师

Learn Influxdb the hard way (1) - Overview of the architecture

前言 Influxdb是目前最流行的时序性数据库之一,由Go语言编写,无需特殊的环境依赖,简单方便,非常适合作为监控系统的后端存储。在容器相关领域的场景中,经常和telegraf、grafana、prometheus等开源系统相集成。从这篇文章开始,我们会从源码深入探讨Influxdb的设计思路。本系列文章基于Influxdbv1.5的源码,需要读者具备influxdb的基本使用经验。 Influxdb架构总览 首先我们先从上帝视角鸟瞰一下Influxdb的整体结构,在后续的文章中我们会深入到每一个组件进行解析。从整体的架构分层上来讲可以分为数据持久层、内部组件层、对外服务层,我们先从最下层向上层进行分析。在存储上,Influxdb分为两种储存,一种是META存储,一种是数据存储,首先我们先从磁盘上的目录结构进行查看。 ├── data

优秀的个人博客,低调大师

Learn Influxdb the hard way (3) - Services in Influxdb I

前言 在上一篇文章中我们梳理了Influxdb的代码主流程结构,从本篇开始将会对Influxdb中的各种Service进行分析,由于篇幅的限制,在这篇文章中会先介绍下MonitorService。在上文中,我们知道Influxdb是通过如下的方式注册Service。 //cmd/influxd/run/server.go 371 s.appendMonitorService() s.appendPrecreatorService(s.config.Precreator) s.appendSnapshotterService() s.appendContinuousQueryService(s.config.ContinuousQuery) s.appendHTTPDService(s.c

优秀的个人博客,低调大师

Learn Jenkins the hard way (2) - Stapler与Jelly

前言 在上篇文章中,我们讨论了如何调试Jenkins的页面。今天我们将开始研究研究Jenkins的页面与路由机制。因为Stapler与Jelly的内容比较繁琐和复杂,暂定通过两篇文章来探讨。 Jelly与Stapler Jelly 是一种基于Java 技术和 XML 的脚本编制和处理引擎。Jelly 的特点是有许多基于JSTL (JSP 标准标记库,JSP Standard Tag Library)、Ant、Velocity 及其它众多工具的可执行标记。Jelly 还支持 Jexl(Java 表达式语言,Java Expression Language,Jexl 是JSTL表达式语言的扩展版本。 Stapler 是一个将应用程序对象和 URL 装订在一起的 lib 库,使编写web应用程序更加方便。Stapler 的核心思想是自动为应用程

优秀的个人博客,低调大师

Learn Jenkins the hard way (0) - Jenkins的罪与罚

写在开头 Jenkins是非常流行的开源的持续交付平台,拥有丰富的插件、文档与良好的社区。是国内大多数公司私有持续集成方案CI/CD服务器的选型。开发者可以快速的通过Jenkins搭架符合自己业务场景的pipeline,结合大量的开源插件,可以轻松的满足不同语言、不同平台、不同框架的持续集成场景。无论是风头蒸蒸日上的Gitlab-CI或者是在开源领域广受好评的travis.ci,都无法替代Jenkins在持续集成领域的地位。但是再高大的建筑也无法遮住阳光下的影子,Jenkins虽然有各种各样的优势,它的问题也足以令人扼腕。本系列的初衷是通过源码的方式学习Jenkins,改造Jenkins。 Jenkins的罪与罚 高可用性 作为持续集成领域多年的Top one,Jenkins的所有的数据存储竟然都是以xml文件的方式进行持久化的。在Jen

优秀的个人博客,低调大师

Learn Jenkins the hard way (1) - 从源码运行Jenkins开始

前言 在上一篇文章中,总结了Jenkins的罪与罚。从本文开始,我们将迈入Jenkins的源码学习部分。学习源码的方式有很多种,对于Jenkins而言,网上关于源码的学习非常有限,比较建议大家先阅读官方关于如何成为contributor的文档,了解大体的结构后再逐步深入。 从源码本地运行Jenkins 学习任何源码前,首先要做的事情是将源码跑起来。克隆Jenkins的源码: git clone https://github.com/jenkinsci/jenkins.git //可以切换到当前的稳定分支 //git checkout jenkins-2.32.2 Jenkins2.0以上的版本依赖JDK1.7以上,以及Maven3.0.4以上(如果需要本地调试Jenkins还需要安装Node.js)。编译

优秀的个人博客,低调大师

手游公司安全负责人:在安全管理的Hard模式中,当一个好“玩家”

据全球媒体Venture Beat的数据,2016年,全球游戏市场份额达到910亿美元,手游占据了一半,中国的手游玩家数量,已经稳居世界第一。 在游戏行业旺盛的生命力背后,网络攻击也在游戏行业中逐利、蓄意破坏、助长恶性竞争。玩家的第二世界,也是 “恶魔的游乐场”。 Steam最近公布的官方数据显示,每个月约有77,000个Steam账户的凭据被盗,每年,全球针对游戏行业的DDoS攻击几乎是成倍增长。 Twitter: 暴雪公司因DDoS攻击而导致无法访问 据全球媒体VentureBeat的数据,2016年,全球游戏市场份额达到910亿美元,手游占据了一半,中国的手游玩家数量,已经稳居世界第一。 在游戏行业旺盛的生命力背后,网络攻击也在游戏行业中逐利、蓄意破坏、助长恶性竞争。玩家的第二世界,也是“恶魔的游乐场”。 Steam最近公布的官方数据显

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册