关系逻辑

[数据结构]绪论

最后都变了- 提交于 2019-12-01 09:40:46
数据结构 所谓数据结构,首先明白研究对象是数据元素,而所谓数据元素可以理解为一条记录项,这是数据的解释. 结构指的是数据元素的关系.有逻辑关系,而逻辑关系指的是数据的结构的设计,实现则依赖于存储结构. 三要素 1. 逻辑结构 集合 线性结构:数据元素之间存在一对一关系 树形结构:数据元素之间存在一对多关系 图状结构或网状结构:数据元素存在多对多关系 2. 存储结构 顺序存储:逻辑上相邻物理位置上也相邻 链接存储:逻辑上相邻,物理位置不要求相邻 索引存储:存储元素信息时,建立附加的索引表.通过索引表去查找数据,而不是通过整个数据去查找信息 散列存储:根据元素的关键字直接计算该元素的存储地址(Hash存储) 3. 数据运算 常用的渐进时间复杂度 O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n) test 特别注意i=i*2这种 要看i初始值是不是2,是2的话,基本是logn的复杂度 void fun(int n) { int i=1; while(i<=n) i=i*2; } //算法复杂度:O(logn) //i=1 while i=2 //i=2 while i=2^2 //i=3 whiel i=2^2^2 //... //2^i <=n ==> i=logn 来源: https://www.cnblogs

Glide缓存流程

怎甘沉沦 提交于 2019-12-01 08:10:56
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/cPLkefpEb3w12-uoiqzTig 作者:连凌能 Android上图片加载的解决方案有多种,但是官方认可的是Glide。Glide提供简洁易用的api,整个框架也方便扩展,比如可以替换网络请求库,同时也提供了完备的缓存机制,应用层不需要自己去管理图片的缓存与获取,框架会分成内存缓存,文件缓存和远程缓存。本文不会从简单的使用着手,会把重点放在缓存机制的分析上。 一、综述 开始之前,关于Glide缓存请先思考几个问题: Glide有几级缓存? Glide内存缓存之间是什么关系? Glide本地文件IO和网络请求是一个线程吗?如果不是,怎么实现线程切换? Glide网络请求回来后数据直接返回给用户还是先存再返回? 加载开始入口从Engine.load()开始,先看下对这个方法的注释, 会先检查(Active Resources),如果有就直接返回,Active Resources没有被引用的资源会放入Memory Cache,如果Active Resources没有,会往下走。 检查Memory Cache中是否有需要的资源,如果有就返回,Memory Cache中没有就继续往下走。 检查当前在运行中的job中是否有改资源的下载

对Serverless的研究

坚强是说给别人听的谎言 提交于 2019-12-01 07:58:07
1. 引言 Serverless 是一种 “无服务器架构”,让用户无需关心程序运行环境、资源及数量,只要将精力 Focus 到业务逻辑上的技术。 现在公司已经实现 DevOps 化,正在向 Serverless 迈进,而为什么前端要关注 Serverless? 对业务前端同学: 会改变前后端接口定义规范。 一定会改变前后端联调方式,让前端参与服务器逻辑开发,甚至 Node Java 混部。 大大降低 Nodejs 服务器维护门槛,只要会写 JS 代码就可以维护 Node 服务,而无需学习 DevOps 相关知识。 对一个自由开发者: 未来服务器部署更弹性,更省钱。 部署速度更快,更不易出错。 前端框架总是带入后端思维,而 Serverless 则是把前端思维带入了后端运维。 前端开发者其实是最早享受到 “Serverless” 好处的群体。他们不需要拥有自己的服务,甚至不需要自己的浏览器,就可以让自己的 JS 代码均匀、负载均衡的运行在每一个用户的电脑中。 而每个用户的浏览器,就像现在最时髦,最成熟的 Serverless 集群,从远程加载 JS 代码开始冷启动,甚至在冷启动上也是卓越领先的:利用 JIT 加速让代码实现毫秒级别的冷启动。不仅如此,浏览器还是实现了 BAAS 服务的完美环境,我们可以调用任何函数获取用户的 Cookie、环境信息、本地数据库服务

【转】什么是组件模式

让人想犯罪 __ 提交于 2019-12-01 07:45:01
作者:哲学 在代码复用和组织数据方面,面向对象可能是大家第一反应。面向对象三大特性继承,封装,多态,在一定程度上能解决不少代码复用,数据复用的问题。不过面向对象不是万能的,它也有极大的缺陷: 1. 数据组织耦合性及强。 一旦父类中增加或删除某个字段,可能要影响到所有子类,影响到所有子类相关的逻辑。这显得非常不灵活,在一套复杂的继承体系中,往父类中改变字段会变得越来越麻烦,比方说ABC是D的子类,某天发现需要增加一个AB都有的数据,但是C没有,那么这个数据肯定不好放到父类中,只能将AB抽象出来一个父类E,E继承于D,AB共有的字段加到E中,一旦继承结构发生了变化,可能接口也要改变,比方说之前有个接口传入参数类型是E,当AB不在需要共用的那个字段,那么需要调整继承关系,让AB重新继承D,那么这个接口的传入参数类型需要改成D,其中的逻辑代码很可能也要发生调整。更可怕的是游戏逻辑变化非常复杂,非常频繁,可能今天加了个字段,明天又删掉了,假如每次都要去调整继承结构,这简直就是噩梦。继承结构面对频繁的数据结构调整感觉很无力。还有个严重的问题,继承结构无法运行时增加删除字段,比如玩家Player平常是走路,使用坐骑后就骑马。问题是坐骑的相关信息就需要一直挂在Player对象上面。这就显得很不灵活,我不骑马的时候内存中为啥要有马的数据? 2. 接口逻辑难以复用,难以热插拔。

THE MINTO PYRAMID PRINCIPLE

旧时模样 提交于 2019-12-01 07:26:46
金字塔原理: (重点突出,逻辑清晰、层次分明,简单易懂的思考方式、沟通方式、规范的动作。) 结构:结论先行,以上统下,归类分组,逻辑递进。先重要后次要,先总结后具体,先框架后细节,先结论后原因,先结果后过程,先论点后论述。 做法:自上而下表达,自上而下思考、纵向总结,横向归类分组,序言讲故事,标题提炼思想精华。 本书大框架:【1、2、3、4.】:1、表达的逻辑 。 2、思考的逻辑。 3、解决问题的逻辑。 4、演示的逻辑。 【1】、表达的逻辑 1)、结构+横向组织+纵向总结 蛋奶产品 【中心思想】 | ———————————————— | | | | 牛奶 鸡蛋 咸鸭蛋 酸奶 【子结构】 2)自上而下思考,总结概括。 组织思想 的逻辑顺序: 1、演绎顺序:大前提、小前提、结论。 2、时间(步骤)顺序:第一、第二、第三 3、结构(空间)顺序:北京、上海、广州。 4、程度(重要性)顺序:最重要、次重要,等等 3)梳理思想过程 1、主题与子主题之间的纵向关系。 2、各子主题之间的横向关系。 3、序言的叙述方式。 4)、序言 呈现方式:背景---冲突----疑问-----回答 例子: 来源: https://www.cnblogs.com/1314520xh/p/11668811.html

操作系统——内存管理

拥有回忆 提交于 2019-12-01 07:05:18
目录 一、存储器管理 1.1存储器的层次结构 1.2程序的装入和链接 1.2.1程序装入 1.2.2程序链接 1.3交换 1.4连续分配管理方式 1.4.1单一连续分配 1.4.2固定分区分配 1.4.3动态分区分配(含顺序和索引算法) 1.4.4动态可重定位分区分配 1.5非连续分配管理方式 1.5.1分页存储管理方式 1.5.2分段存储管理方式 1.5.3段页式存储管理方式 二、虚拟存储器 2.1基本概念 2.2请求分页存储管理方式 2.2.1请求分页中的硬件支持 2.2.2请求分页中的内存分配 2.2.3页面调入策略 2.3页面置换算法 2.4“抖动”与工作集 一、存储器管理 1.1存储器的层次结构 1、多层结构的存储器系统 1)存储器的多层结构 通用计算机存储层次有三级:CPU寄存器,主存,辅存 主存包括:高速缓存、主存储器、磁盘缓存 辅存包括:固定磁盘、可移动存储介质 寄存器、高速缓存、主存储器和磁盘缓存属于 操作系统存储管理 的管辖范畴,断电后存储信息丢失;固定磁盘、可移动存储介质属于 设备管理 的管辖范畴,存储信息被长期保存 2)可执行存储器 寄存器和主存储器被称为可执行存储器 进程可以在很少的时钟周期内使用 load和 store指令访问可执行存储器,但对辅存的访问需要通过 I/O设备实现,耗费时间远超前者 2、主存储器与寄存器 1)主存储器 简称内存或主存,用于

后端开发实践系列——领域驱动设计(DDD)编码实践

夙愿已清 提交于 2019-12-01 06:37:31
Martin Fowler在《 企业应用架构模式 》一书中写道: I found this(business logic) a curious term because there are few things that are less logical than business logic. 初略翻译过来可以理解为:业务逻辑是很没有逻辑的逻辑。 的确,很多时候软件的业务逻辑是无法通过推理而得到的,有时甚至是被臆想出来的。这样的结果使得原本已经很复杂的业务变得更加复杂而难以理解。而在具体编码实现时,除了应付业务上的复杂性,技术上的复杂性也不能忽略,比如我们要讲究技术上的分层,要遵循软件开发的基本原则,又比如要考虑到性能和安全等等。 在很多项目中,技术复杂度与业务复杂度相互交错纠缠不清,这种火上浇油的做法成为不少软件项目无法继续往下演进的原因。然而,在合理的设计下,技术和业务是可以分离开来或者至少它们之间的耦合度是可以降低的。在不同的软件建模方法中, 领域驱动设计 (Domain Driven Design,DDD)尝试通过其自有的原则与套路来解决软件的复杂性问题,它将研发者的目光首先聚焦在业务本身上,使技术架构和代码实现成为软件建模过程中的“副产品”。 DDD总览 DDD分为战略设计和战术设计。在战略设计中,我们讲求的是子域和 限界上下文(Bounded Context,BC)

解析Linux中LVM与磁盘配额

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-01 05:08:53
LVM 逻辑卷管理 LVM 概述 LVM 是 Linux 操作系统中对磁盘分区进行管理的一种逻辑机制,它是建立在硬盘和分区之上、文件系统之下的一个逻辑层,在建立文件系统时屏蔽了下层的磁盘分区布局,因此能够在保持现有数据不变的情况下动态调整磁盘容量,从而增强磁盘管理的灵活性。 要建立 LVM 分区管理机制,首先,将普通分区或整个硬盘创建为物理卷;然后,将物理上比较分散的各物理卷的存储空间组成一个逻辑整体,即卷组;最后,基于卷组这个整体,分割出不同的数据存储空间,形成逻辑卷。逻辑卷才是最终用户可以格式化并挂载使用的存储单位。 1、PV(Physical Volume,物理卷) 物理卷是 LVM 机制的基本存储设备,通常对应为一个普通分区或整个硬盘,。创建物理卷时,会在分区或硬盘的头部创建一个保留区块,用于记录 LVM 的属性,并把存储空间分割成默认大小为 4MB 的基本单元 (Physical Extent,PE) ,从而构成物理卷。 对用于转换成物理卷的普通分区,建议先使用 fdisk 工具将分区类型的 ID 标记号改为 8e 。若是整块硬盘,可以将所有磁盘空间划分为一个主分区后再做相应调整。 2、VG(Volume Group,卷组) 由一个或多个物理卷组成一个整体,即称为卷组,在卷组中可以动态地添加或移除物理卷,许多个物理卷可以分别组成不同的卷组,卷组的名称由用户自行定义。 3

Shell主要逻辑源码级分析 (2)——SHELL作业控制

守給你的承諾、 提交于 2019-12-01 03:26:24
版权声明:本文由李航原创文章,转载请注明出处: 文章原文链接: https://www.qcloud.com/community/article/110 来源:腾云阁 https://www.qcloud.com/community 作业控制本身也是基于进程控制的,两者关系密切,所以SHELL进程控制与作业控制的机制都在本章描述。 一. 主要相关文件 jobs.c jobs.h nojobs.c 备注:其中nojobs.c用于在早期的一些不支持作业控制的操作系统中代替jobs.c编译,其函数接口集是jobs.c的子集,而且现今的主要操作系统都是支持作业控制的,因此并未专门注释nojobs.c文件,而详细注释了jobs.c文件。如果需要查看nojobs.c中部分函数的功能,则直接查找对应的jobs.c的版本即可。 二. 重要数据结构 进程: typedef struct process { struct process *next; /* 指向管道中的下一个进程*/ pid_t pid; /* 进程id */ WAIT status; /* wait等待该进程所返回的结果*/ int running; /* 是否处于运行状态,共有PS_DONE、PS_RUNNING、 PS_STOPPED、PS_RECYCLED*/ char *command; /* 该进程所正在执行的命令*/ }

Windows程序设计3(资源、绘图、坐标系)

大兔子大兔子 提交于 2019-12-01 02:12:13
一、 RC 资源的使用 资源相关 资源脚本文件: *.rc 文件 编译器: RC.EXE 菜单资源的使用 1 添加菜单资源:通过菜单栏中插入( rc )菜单资源。或直接添加资源脚本到工程中。 2 加载菜单资源 2.1 在注册时设置菜单资源 2.2 加载菜单资源,设置到窗口 HMENU LoadMenu( HINSTANCE hInstance, // 应用程序句柄 LPCTSTR lpMenuName // 菜单字符串资源(或菜单资源 ID ) ); MAKEINTRESOURCE 宏,可以使得数字形式的资源 ID,转化为字符串形式的资源ID。 宏原型: LPTSTR MAKEINTRESOURCE( WORD wInteger // 转化的整数 ); 使用地方: 1. CreateWindow/Ex 创建窗口时。 如:wndclass.lpszMenuName =MAKEINTRESOURCE(IDR_MENU1); 2. 在WM_CREATE时,通过SetMenu(): 函数原型 :BOOL SetMenu( HWND hWnd, // 窗口句柄 HMENU hMenu // 菜单句柄 , 可以通过 LoadMenu() 获得。 ); 如: HMENU hMenu=LoadMenu(g_hInstance,MAKEINTRESOURCE(IDR_MENU1)); SetMenu