在群里看到一个听说是阿里校招的面试题的图片,不得不感慨阿里的面试问的内容之广,前端,算法,数据结构,数学知识,网络,服务器等都有包含到。大量的题目都是本身的知识盲区或者答不全,因此花了两个星期对除了后端语言和mySql的题都作了一遍,收获很多,记录于此。javascript
参考 www.jianshu.com/p/fbfc6c751…php
css样式表继承指的是,特定的css属性向下传递到后代元素css
1.字体系列属性:font, font-family, font-weight, font-size, font-style, font-variant, font-stretch, font-size-adjust...html
2.文本系列属性:text-indent, text-align, line-height, word-spacing, letter-spacing, direction, color...前端
3.元素可见性:visibilityvue
4.表格布局属性:caption-side、border-collapse、border-spacing、empty-cells、table-layout...java
5.列表属性:list-style-type、list-style-image、list-style-position、list-style...node
6.生成内容属性:quotescss3
7.光标属性:cursorweb
元素可见性, 光标属性
字体系列属性, 除text-indent、text-align以外的文本系列属性
一、text-indent、text-align
一、display
二、文本属性:vertical-align,text-decoration,text-shadow,white-space,unicode-bidi
三、盒子模型的属性:宽度、高度、内外边距、边框等
四、背景属性:背景图片、颜色、位置等
五、定位属性:浮动、清除浮动、定位position等
六、生成内容属性:content、counter-reset、counter-increment
七、轮廓样式属性:outline-style、outline-width、outline-color、outline
八、页面样式属性:size、page-break-before、page-break-after
li:nth-child(2)
{
...
}
复制代码
不少浏览器提供了某些触发的CSS规则。
如今,像Chrome, FireFox, Safari, IE9+和最新版本的Opera都支持GPU加速,当它们检测到页面中某个DOM元素应用了某些CSS规则时就会开启,最显著的特征的元素的3D变换。
们可能不想对元素应用3D变换,可咱们同样能够开启3D引擎。例如咱们能够用transform: translateZ(0); 来开启硬件加速
咱们能够加入如下代码来触发硬件加速:
.cube {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
/* Other transform properties here */
}
复制代码
filter 属性定义了元素(一般是)的可视效果(例如:模糊与饱和度)。 简单来讲就是滤镜。filter函数对应了不一样的滤镜
filter: none | blur() | brightness() | contrast() | drop-shadow() | grayscale() | hue-rotate() | invert() | opacity() | saturate() | sepia() | url();
复制代码
全部滤镜的展现效果: www.runoob.com/try/try.php…
<meta name="viewport" content="width=device-width,initial-scale=1" />
复制代码
meta标签是head部的一个辅助性标签,提供关于 HTML 文档的元数据。它并不会显示在页面上,但对于机器是可读的。可用于浏览器(如何显示内容或从新加载页面),搜索引擎(SEO),或其余 web 服务。
meta标签里的数据是供机器解读的,其主要做用有:搜索引擎优化(SEO),定义页面使用语言,自动刷新并指向新的页面,实现网页转换时的动态效果,控制页面缓冲,网页定级评价,控制网页显示的窗口等等。
说明:用以说明网页制做所使用的文字以及语言
说明:设置网页的过时时间,一旦过时则必须到服务器上从新获取。须要注意的是必须使用GMT时间格式
说明:定时让网页在指定的时间n内,跳转到页面
Cookie设定,若是网页过时,存盘的cookie将被删除。须要注意的也是必须使用GMT时间格式;
说明:用于设定禁止浏览器从本地计算机的缓存中访问页面内容
说明:用于设定强制页面在窗口中以独立页面显示,防止本身的网页被别人看成一个frame页调用
说明:用于设定页面进入和离开时的过渡效果,注意被添加的页面不能在一个frame中
说明:keywords用来告诉搜索引擎你网页的关键字是什么。
说明:description用来告诉搜索引擎你的网站主要内容。
说明:robots用来告诉搜索机器人哪些页面须要索引,哪些页面不须要索引
说明:generator用于说明网站版权信息
说明:viewport用于说明移动端网站的宽高缩放比例等信息
og是一种新的HTTP头部标记,即Open Graph Protocol,这种协议可让网页成为一个“富媒体对象"。用了property=og标签,就是你赞成了网页内容能够被其余社会化网站引用等,目前这种协议被SNS网站如Fackbook、renren采用
<!-- 设定字符集 -->
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- 页面关键词 keywords -->
<meta name="keywords" content="your keywords">
<!-- 页面描述内容 description -->
<meta name="description" content="your description">
<!-- 定义网页做者 author -->
<meta name="author" content="author,email address">
<!-- 定义网页搜索引擎索引方式,robotterms 是一组使用英文逗号「,」分割的值,一般有以下几种取值:none,noindex,nofollow,all,index和follow。 -->
<meta name="robots" content="index,follow">
<!-- 优先使用最新的chrome版本 -->
<meta http-equiv="X-UA-Compatible" content="chrome=1" />
<!-- 禁止自动翻译 -->
<meta name="google" value="notranslate">
<!-- 禁止转码 -->
<meta http-equiv="Cache-Control" content="no-transform">
<!-- 选择使用的浏览器解析内核 -->
<meta name="renderer" content="webkit|ie-comp|ie-stand">
<!-- 移动端 -->
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta name="format-detection"content="telephone=no, email=no" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" /><!-- 删除苹果默认的工具栏和菜单栏 -->
<meta name="apple-mobile-web-app-status-bar-style" content="black" /><!-- 设置苹果工具栏颜色 -->
<meta name="format-detection" content="telphone=no, email=no" /><!-- 忽略页面中的数字识别为电话,忽略email识别 -->
<!-- 启用360浏览器的极速模式(webkit) -->
<meta name="renderer" content="webkit">
<!-- 避免IE使用兼容模式 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,好比黑莓 -->
<meta name="HandheldFriendly" content="true">
<!-- 微软的老式浏览器 -->
<meta name="MobileOptimized" content="320">
<!-- uc强制竖屏 -->
<meta name="screen-orientation" content="portrait">
<!-- QQ强制竖屏 -->
<meta name="x5-orientation" content="portrait">
<!-- UC强制全屏 -->
<meta name="full-screen" content="yes">
<!-- QQ强制全屏 -->
<meta name="x5-fullscreen" content="true">
<!-- UC应用模式 -->
<meta name="browsermode" content="application">
<!-- QQ应用模式 -->
<meta name="x5-page-mode" content="app">
<!-- windows phone 点击无高光 -->
<meta name="msapplication-tap-highlight" content="no">
复制代码
默认值。没有定位,元素出如今正常的流中
生成绝对定位的元素,相对于 static 定位之外的第一个父元素进行定位。
生成绝对定位的元素,相对于浏览器窗口进行定位
生成相对定位的元素,相对于其正常位置进行定位。 所以,"left:20" 会向元素的 LEFT 位置添加 20 像素。
规定应该从父元素继承 position 属性的值
两个对css进行扩展的预处理语言
最小间隔为显示器每一帧的时间
Shadow DOM是HTML的一个规范 ,它容许浏览器开发者封装本身的HTML标签、CSS样式和特定的javascript代码,同时也可让开发人员建立相似video这样的自定义一级标签,建立这些新标签内容和相关的的API被称为Web Component。
SVG 是一种使用 XML 描述 2D 图形的语言。
SVG 基于 XML,这意味着 SVG DOM 中的每一个元素都是可用的。您能够为某个元素附加 JavaScript 事件处理器。
在 SVG 中,每一个被绘制的图形均被视为对象。若是 SVG 对象的属性发生变化,那么浏览器可以自动重现图形
Canvas 经过 JavaScript 来绘制 2D 图形。
Canvas 是逐像素进行渲染的。
在 canvas 中,一旦图形被绘制完成,它就不会继续获得浏览器的关注。若是其位置发生变化,那么整个场景也须要从新绘制,包括任何或许已被图形覆盖的对象。
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
context.fillStyle = 'rgba(280,187,188,1)';
context.fillRect(10,10,100,100);
context.globalAlpha = 0.5;//透明度为0.5
复制代码
context.fillStyle = 'rgba(280,187,188,1)';
context.fillRect(150,150,100,100);
context.globalCompositeOperation = 'source-in';//重叠部分可见,其余透明。
复制代码
source-over(默认):后绘制图层位于前图层上方。
source-in:图层重叠部分可见,其余透明。
source-out:图层不重叠部分可见,先绘制层透明。
source-atop:图层重叠部分可见,先绘制不受影响。
destination-over:后绘制图层位于前图层下方。
destination-in:后绘制图层位于前图层下方,不重叠部分透明。
destination-out:后绘制图形擦除与先绘制图形重叠部分。
destination-atop:后绘制图层位于下方,不重叠部分,先绘制层透明。
dom渲染的性能损耗主要在dom的改变引发了dom树的重排和重绘;
重绘:是一个元素外观的改变所触发的浏览器行为,例如改变visibility、outline、背景色等属性(上面说到的其余属性)。浏览器会根据元素的新属性从新绘制,使元素呈现新的外观。重绘不会带来从新布局,并不必定伴随重排。
重排:当DOM的变化影响了元素的几何属性(宽或高),浏览器须要从新计算元素的几何属性,一样其余元素的几何属性和位置也会所以受到影响。浏览器会使渲染树中受到影响的部分失效,并从新构造渲染树。这个过程称为重排。重排必定伴随着重绘。(重排次数多可能会致使浏览器垮掉而页面闪烁)
为了减小重排重绘,能够先让元素脱离文档流,操做完后再带入文档流,这样只会触发一次重排。 具体方法:
给img添加onload事件
若是是监听大量的图片加载完成,则在父元素上添加load事件捕获
经过WebAssembly 能够在浏览器中扩展C/C++/Rust语言。 预计会推出的语言有Go,Java和C#
一个被淘汰的浏览器语言
pending、fulfilled、rejected(未决定,履行,拒绝)
初始化,状态:pending
当调用resolve(成功),状态:pengding=>fulfilled
当调用reject(失败),状态:pending=>rejected
能够,promise能够链式调用,源码的then方法返回的是promise对象自己,因此能够实现链式调用。
虚拟dom就是用js的对象模拟dom中的节点,使用虚拟dom能够减小页面元素的修改次数,减小页面的重排重绘,提升性能。
实现步骤:
class crtateElement {
constructor (el, attr, child) {
this.el = el
this.attrs = attr
this.child = child || []
}
render () {
let virtualDOM = document.createElement(this.el)
// attr是个对象因此要遍历渲染
for (var attr in this.attrs) {
virtualDOM.setAttribute(attr, this.attrs[attr])
}
// 深度遍历child
this.child.forEach(el => {
//若是子节点是一个元素的话,就调用它的render方法建立子节点的真实DOM,若是是一个字符串的话,建立一个文件节点就能够了
// 判断一个对象是不是某个对象的实力
let childElement = (el instanceof crtateElement) ? el.render() : document.createTextNode(el);
virtualDOM.appendChild(childElement);
});
return virtualDOM
}
}
let ul = new crtateElement('div',myobj,[
'我是文字',
element('div',{'id': 'xiao'},['1']),
element('div',{'id': 'xiao1'},['2']),
element('div',{'id': 'xiao2'},['3']),
])
复制代码
let utils = require('./utils');
let keyIndex = 0;
function diff(oldTree, newTree) {
//记录差别的空对象。key就是老节点在原来虚拟DOM树中的序号,值就是一个差别对象数组
let patches = {};
keyIndex = 0; // 儿子要起另一个标识
let index = 0; // 父亲的表示 1 儿子的标识就是1.1 1.2
walk(oldTree, newTree, index, patches);
return patches;
}
//遍历
function walk(oldNode, newNode, index, patches) {
let currentPatches = [];//这个数组里记录了全部的oldNode的变化
if (!newNode) {//若是新节点没有了,则认为此节点被删除了
currentPatches.push({ type: utils.REMOVE, index });
//若是说老节点的新的节点都是文本节点的话
} else if (utils.isString(oldNode) && utils.isString(newNode)) {
//若是新的字符符值和旧的不同
if (oldNode != newNode) {
///文本改变
currentPatches.push({ type: utils.TEXT, content: newNode });
}
} else if (oldNode.tagName == newNode.tagName) {
//比较新旧元素的属性对象
let attrsPatch = diffAttr(oldNode.attrs, newNode.attrs);
//若是新旧元素有差别 的属性的话
if (Object.keys(attrsPatch).length > 0) {
//添加到差别数组中去
currentPatches.push({ type: utils.ATTRS, attrs: attrsPatch });
}
//本身比完后再比本身的儿子们
diffChildren(oldNode.children, newNode.children, index, patches, currentPatches);
} else {
currentPatches.push({ type: utils.REPLACE, node: newNode });
}
if (currentPatches.length > 0) {
patches[index] = currentPatches;
}
}
//老的节点的儿子们 新节点的儿子们 父节点的序号 完整补丁对象 当前旧节点的补丁对象
function diffChildren(oldChildren, newChildren, index, patches, currentPatches) {
oldChildren.forEach((child, idx) => {
walk(child, newChildren[idx], ++keyIndex, patches);
});
}
function diffAttr(oldAttrs, newAttrs) {
let attrsPatch = {};
for (let attr in oldAttrs) {
//若是说老的属性和新属性不同。一种是值改变 ,一种是属性被删除 了
if (oldAttrs[attr] != newAttrs[attr]) {
attrsPatch[attr] = newAttrs[attr];
}
}
for (let attr in newAttrs) {
if (!oldAttrs.hasOwnProperty(attr)) {
attrsPatch[attr] = newAttrs[attr];
}
}
return attrsPatch;
}
module.exports = diff;
复制代码
let keyIndex = 0;
let utils = require('./utils');
let allPatches;//这里就是完整的补丁包
function patch(root, patches) {
allPatches = patches;
walk(root);
}
function walk(node) {
let currentPatches = allPatches[keyIndex++];
(node.childNodes || []).forEach(child => walk(child));
if (currentPatches) {
doPatch(node, currentPatches);
}
}
function doPatch(node, currentPatches) {
currentPatches.forEach(patch => {
switch (patch.type) {
case utils.ATTRS:
for (let attr in patch.attrs) {
let value = patch.attrs[attr];
if (value) {
utils.setAttr(node, attr, value);
} else {
node.removeAttribute(attr);
}
}
break;
case utils.TEXT:
node.textContent = patch.content;
break;
case utils.REPLACE:
let newNode = (patch.node instanceof Element) ? path.node.render() : document.createTextNode(path.node);
node.parentNode.replaceChild(newNode, node);
break;
case utils.REMOVE:
node.parentNode.removeChild(node);
break;
}
});
}
module.exports = patch;
复制代码
组件中的data写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,相似于给每一个组件实例建立一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得全部组件实例共用了一份data,就会形成一个变了全都会变的结果
js变量中的引用类型再复制的操做中会复制地址,致使两个变量指向同一份数据。
深拷贝和浅拷贝都是针对引用类型,防止地址复制的,浅拷贝只进行了一层的拷贝,深拷贝利用递归进行了无数层。
全部在须要复制一个复杂对象进行操做且不但愿影响影响原对象的时候,应该采起深拷贝。
指针就是内存地址,在js中,引用类型如对象和数组,他们的值都是指向对应的地址,在赋值传递的过程当中为地址传递
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
node.js能够做为一个让js运行在服务端的开发平台
一个程序能够有多个进程;
一个进程能够有多个线程;
进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大地提升了程序的运行效率。;
多个线程之间能够相互通讯;
每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。可是线 程不可以独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意 义在于一个应用程序中,有多个执行部分能够同时执行。但操做系统并无将多个线程看作多个独立的应用,来实现 进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
从chrome浏览器来理解进程个线程https://blog.csdn.net/Donspeng/article/details/82970503
一、没法捕捉到语法错误,只能捕捉运行时错误;
二、能够拿到出错的信息,堆栈,出错的文件、行号、列号;
四、须要借助工具把全部的function块以及文件块加入try,catch,能够在这个阶段打入更多的静态信息
因为try..catch只能捕获块里面的错误,全局的一些错误能够用window.onerror来捕捉
1) 完成TCP三次同步握手 2) 客户端验证服务器数字证书,经过,进入步骤3 3) DH算法协商对称加密算法的密钥、hash算法的密钥 4) SSL安全加密隧道协商完成 5)网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改
现有的量子计算机的能力没法破解公钥私钥结合的非对称加密,可是随着量子计算技术的发展,总有一天会对现有密码构成实际威胁。
国际上从2006年开始举办"抗量子计算密码学术会议(PostQuantum Cryptography)",每两年举行一次,至今已举办了4届。已经产生了一批重要的研究成果,让人们看到了抗量子计算密码的新曙光。
量子计算机经过量子力学的量子比特的两种量子态来表示经典比特状态0,1。 现代量子计算机模型的核心技术即是态叠加原理,属于量子力学的一个基本原理。一个体系中,每一种可能的运动方式就被称做态。在微观体系中,量子的运动状态没法肯定,呈现统计性,与宏观体系肯定的运动状态相反。量子态就是微观体系的态。
浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires; Cache-control等)。可是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者能够在HTML页面的节点中加入标签,代码以下:
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
复制代码
告诉浏览器当前页面不被缓存
Expires(过时时间): 这个属性告诉缓存器:相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向源服务器发送请求
Cache-Control响应头信息:
1) no-cache:表示必须先与服务器确认返回的响应是否被更改。
2) no-store:更加简单,直接禁止浏览器和全部中继缓存存储返回的任何版本的响应
3) max-age:该指令指定从当前请求开始,容许获取的响应被重用的最长时间(单位为秒)
4) s-maxage=[秒]: 相似于max-age属性,除了他应用于共享(如:代理服务器)缓存。
5) public : 标记认证内容也能够被缓存
内容较多,详情参考连接 www.cnblogs.com/heluan/p/86…
详细参考:
TCP协议保证数据传输可靠性的方式主要有:
发送的数据包的二进制相加而后取反,目的是检测数据在传输过程当中的任何变化。若是收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
序列号:TCP传输时将每一个字节的数据都进行了编号,这就是序列号。
确认应答:TCP传输的过程当中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
序列号的做用不只仅是应答的做用,有了序列号可以将接收到的数据根据序列号排序,而且去掉重复序列号的数据,这也是TCP传输可靠性的保证之一。
当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。若是不能及时收到一个确认,将重发这个报文段。
TCP链接的每一方都有固定大小的缓冲空间,TCP的接收端只容许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方下降发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。
TCP引入了慢启动的机制,在开始发送数据时,先发送少许的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。这时候就引入一个叫作拥塞窗口的概念。发送刚开始定义拥塞窗口为1,每次收到ACK应答,拥塞窗口加 1。在发送数据以前,首先将拥塞窗口与接收端反馈的窗口大小比对,取较小的值做为实际发送的窗口。
拥塞窗口的增加是指数级别的。慢启动的机制只是说明在开始的时候发送的少,发送的慢,可是增加的速度是很是快的。为了控制拥塞窗口的增加,不能使拥塞窗口单纯的加倍,设置一个拥塞窗口的阈值,当拥塞窗口大小超过阈值时,不能再按照指数来增加,而是线性的增加。在慢启动开始的时候,慢启动的阈值等于窗口的最大值,一旦形成网络拥塞,发生超时重传时,慢启动的阈值会为原来的一半(这里的原来指的是发生网络拥塞时拥塞窗口的大小),同时拥塞窗口重置为 1。
拥塞控制是TCP在传输时尽量快的将数据传输,而且避免拥塞形成的一系列问题。是可靠性的保证,同时也是维护了传输的高效性。
拥塞控制主要是四个算法:1)慢启动,2)拥塞避免,3)拥塞发生,4)快速恢复。
TCP引入了窗口这个概念,即便在往返时间比较长的状况下,它也可以控制网络性能的降低。确认应答包再也不以每一个段为单位进行确认了,而是以更大的单位进行确认,转发时间将会被大幅度的缩短。也就是说,发送端主机在发送了一个段以后,不必一直等待对端主机的确认应答信号,而是继续发送。
窗口大小,指的就是无需等待接收端主机的确认应答信号而能够持续发送的数据的最大值,或者说段的最大值
在滑动窗口之外的数据,包括还没有发送出去的数据,以及已经确认对端收到的数据,当发送端确认对端已经收到数据包以后,此数据包就能够从缓冲区中清除了。
当收到确认应答信号过以后,会把滑动窗口的位置滑动到确认应答的序列号的位置,这样就能够顺序的将多个段同时发送以提升通讯功能了。这就是滑动窗口控制。
UDP不提供复杂的控制机制,利用IP提供面向无链接的通讯服务。而且它是将应用程序发来的数据在收到的那一刻,马上按照原样发送到网络上的一种机制。 即便是出现网络拥堵的状况下,UDP也没法进行流量控制等避免网络拥塞的行为。此外,传输途中若是出现了丢包,UDO也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。若是须要这些细节控制,那么不得不交给由采用UDO的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,本身却只提供做为传输层协议的最基本功能。UDP有点相似于用户说什么听什么的机制,可是须要用户充分考虑好上层协议类型并制做相应的应用程序。
UDP应用场景:
TCP充分实现了数据传输时各类控制功能,能够进行丢包的重发控制,还能够对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP做为一种面向有链接的协议,只有在确认通讯对端存在时才会发送数据,从而能够控制通讯流量的浪费。TCP经过检验、序列号、确认应答、重发控制、链接管理以及窗口控制等机制实现可靠性传输。
咱们常用“ping”命令来测试两台主机之间TCP/IP通讯是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,而后对方主机确认收到数据包,若是数据包是否到达的消息及时反馈回来,那么网络就是通的。而损失了多少数据就是丢包率
推荐一个借魔兽世界游戏服务器来讲明两种协议各自的优缺点的文章
UDP在相应速度上是优于TCP,安全性和数据可靠性上不如TCP
因此,UDP通常用在网络负担很是重,但对响应速度要求高,数据类型都是短消息的状况下。
若是你写一个有肢体触碰的即时动做对战游戏,那就应该用UDP,由于须要快速的物理碰撞检测反应
若是dota类游戏,则应该使用TCP,能够更好地保证数据可靠和减小丢包。
快速排序时间复杂度的证实
最优状况每次均分,最差状况每次分到极值
分布式系统是由一组经过网络进行通讯、为了完成共同的任务而协调工做的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机没法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。
分布式排序是指,在p台已经斌于序号的计算机C1,C2,……,Cp上,对一组给定的数据分布X={X1,X2,……,Xp}进行全局排序,获得一个新的数据分布Y={Y1,Y2,……,Yp},使得每一个Yi(1≤i≤p)有序,而且Yi的每一个元素不大于Yj的任何元素,i≤j。
详细见文章
矩阵的秩是线性代数中的一个概念。在线性代数中,一个矩阵A的列秩是A的线性独立的纵列的极大数,一般表示为r(A),rk(A)或rank A
都是一些微积分的基本概念,推荐阅读