-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
314 lines (261 loc) · 42.6 KB
/
index.html
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>文的盲</title><meta name="description"><meta name="author" content="文盲"><meta name="copyright" content="文盲"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta http-equiv="Cache-Control" content="no-transform"><meta http-equiv="Cache-Control" content="no-siteapp"><link rel="shortcut icon" href="/image/logo.jpg"><link rel="canonical" href="https://wenmang.gitbub.io/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//hm.baidu.com"/><link rel="preconnect" href="//fonts.googleapis.com" crossorigin="crossorigin"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><meta name="google-site-verification" content="zQh_3xdHMcwmloRRjFpHXDaT3euJrJQdLnKV_IX5K1Q"/><meta property="og:type" content="website"><meta property="og:title" content="文的盲"><meta property="og:url" content="https://wenmang.gitbub.io/"><meta property="og:site_name" content="文的盲"><meta property="og:description"><meta property="og:image" content="https://wenmang.gitbub.io/image/avatar.jpg"><meta property="article:published_time" content="2020-09-25T10:08:19.464Z"><meta property="article:modified_time" content="2020-09-25T10:08:19.464Z"><meta name="twitter:card" content="summary"><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.css"><script><!-- hexo-inject:begin --><!-- hexo-inject:end -->var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?368a5ed7d73f0d4d2bd25d9682f37580";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Titillium+Web&display=swap"><script>var GLOBAL_CONFIG = {
root: '/',
hexoversion: '5.1.1',
algolia: undefined,
localSearch: undefined,
translate: undefined,
noticeOutdate: undefined,
highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true},
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
},
bookmark: {
message_prev: '按',
message_next: '键将本页加入书签'
},
runtime: '',
date_suffix: undefined,
copyright: undefined,
ClickShowText: undefined,
medium_zoom: false,
fancybox: true,
Snackbar: undefined,
justifiedGallery: {
js: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/js/jquery.justifiedGallery.min.js',
css: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/css/justifiedGallery.min.css'
},
baiduPush: false,
isPhotoFigcaption: true,
islazyload: true,
isanchor: false
};
var saveToLocal = {
set: function setWithExpiry(key, value, ttl) {
const now = new Date()
const expiryDay = ttl * 86400000
const item = {
value: value,
expiry: now.getTime() + expiryDay,
}
localStorage.setItem(key, JSON.stringify(item))
},
get: function getWithExpiry(key) {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = new Date()
if (now.getTime() > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}</script><script id="config_change">var GLOBAL_CONFIG_SITE = {
isPost: false,
isHome: true,
isHighlightShrink: false,
isSidebar: false,
postUpdate: '2020-09-25 18:08:19'
}</script><noscript><style type="text/css">
#nav {
opacity: 1
}
.justified-gallery img {
opacity: 1
}
</style></noscript><link rel="stylesheet" href="APlayer.min.css"><div id="aplayer"></div><script src="https://cdn.jsdelivr.net/gh/radium-bit/res@master/live2d/autoload.js" async></script><script src="https://cdn.jsdelivr.net/npm/meting@2/dist/Meting.min.js" async></script><script>var activateDarkMode = function () {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
var activateLightMode = function () {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
var autoChangeMode = 'false'
var t = saveToLocal.get('theme')
if (autoChangeMode === '1') {
var isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
var isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches
var isNotSpecified = window.matchMedia('(prefers-color-scheme: no-preference)').matches
var hasNoSupport = !isDarkMode && !isLightMode && !isNotSpecified
if (t === undefined) {
if (isLightMode) activateLightMode()
else if (isDarkMode) activateDarkMode()
else if (isNotSpecified || hasNoSupport) {
console.log('You specified no preference for a color scheme or your browser does not support it. I Schedule dark mode during night time.')
var now = new Date()
var hour = now.getHours()
var isNight = hour <= 6 || hour >= 18
isNight ? activateDarkMode() : activateLightMode()
}
window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) {
if (saveToLocal.get('theme') === undefined) {
e.matches ? activateDarkMode() : activateLightMode()
}
})
} else if (t === 'light') activateLightMode()
else activateDarkMode()
} else if (autoChangeMode === '2') {
now = new Date()
hour = now.getHours()
isNight = hour <= 6 || hour >= 18
if (t === undefined) isNight ? activateDarkMode() : activateLightMode()
else if (t === 'light') activateLightMode()
else activateDarkMode()
} else {
if (t === 'dark') activateDarkMode()
else if (t === 'light') activateLightMode()
}</script><!-- hexo injector head_end start -->
<link rel="stylesheet" href="/custom_css_source.css">
<!-- hexo injector head_end end --><meta name="generator" content="Hexo 5.1.1"><!-- hexo-inject:begin --><!-- hexo-inject:end --><link rel="alternate" href="/atom.xml" title="文的盲" type="application/atom+xml">
</head><body><div id="mobile-sidebar"><div id="menu_mask"></div><div id="mobile-sidebar-menus"><div class="mobile_author_icon"><img class="avatar-img" data-lazy-src="/image/avatar.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="mobile_post_data"><div class="mobile_data_item is-center"><div class="mobile_data_link"><a href="/archives/"><div class="headline">文章</div><div class="length_num">50</div></a></div></div><div class="mobile_data_item is-center"> <div class="mobile_data_link"><a href="/tags/"><div class="headline">标签</div><div class="length_num">23</div></a></div></div><div class="mobile_data_item is-center"> <div class="mobile_data_link"><a href="/categories/"><div class="headline">分类</div><div class="length_num">2</div></a></div></div></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 清单</span><i class="fas fa-chevron-down expand"></i></a><ul class="menus_item_child"><li><a class="site-page" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page" href="/movies/"><i class="fa-fw fas fa-video"></i><span> 视频</span></a></li><li><a class="site-page" href="/Gallery/"><i class="fa-fw fas fa-images"></i><span> 图片</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div></div></div><div id="body-wrap"><header class="full_page" id="page-header" style="background-image: url(https://i.loli.net/2020/08/30/rKtH1fxmLVdzJTl.png)"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">文的盲</a></span><span class="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 清单</span><i class="fas fa-chevron-down expand"></i></a><ul class="menus_item_child"><li><a class="site-page" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page" href="/movies/"><i class="fa-fw fas fa-video"></i><span> 视频</span></a></li><li><a class="site-page" href="/Gallery/"><i class="fa-fw fas fa-images"></i><span> 图片</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div><span class="toggle-menu close"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></span></span></nav><div id="site-info"><h1 id="site_title">文的盲</h1><div id="site_subtitle"><span id="subtitle"></span></div><div id="site_social_icons"><a class="social-icon" href="https://github.com/wenmang" target="_blank" title="Github"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:[email protected]" target="_blank" title="Email"><i class="fas fa-envelope"></i></a><a class="social-icon" href="https://wenmang.github.io" target="_blank" title="Rss"><i class="fas fa-rss"></i></a></div></div><div id="scroll_down"><i class="fas fa-angle-down scroll-down-effects"></i></div></header><main class="layout_page" id="content-inner"><div class="recent-posts" id="recent-posts"><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2020/08/30/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E4%BC%A0%E8%BE%93%E5%B1%82/" title="计算机网络传输层"> <img class="post_bg" data-lazy-src="https://i.loli.net/2020/08/31/JPSdKkEU3Mvqzio.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="计算机网络传输层"></a></div><div class="recent-post-info"><a class="article-title" href="/2020/08/30/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E4%BC%A0%E8%BE%93%E5%B1%82/" title="计算机网络传输层">计算机网络传输层</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2020-08-30T07:36:13.000Z" title="发表于 2020-08-30 15:36:13">2020-08-30</time></span><span class="article-meta"><span class="article-meta__separator">|</span><i class="fas fa-inbox article-meta__icon"></i><a class="article-meta__categories" href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/">计算机网络</a></span></div><div class="content"><!-- hexo-inject:begin --><!-- hexo-inject:end -->传输层介于应用层与网络层之间,是计算机网络最为基本的一层,该层的协议为应用进程提供端到端的通信服务。其提供面向连接的数据流支持、可靠性、流量控制、多路复用等服务。
此层还包含了两个重要的传输层服务:TCP 和 UDP 。
由于传输层的下一层,网络层的 IP 服务是不做任何保证的,是一个不可靠服务,因此传输层就必须做一定的保障服务。
多路复用与多路分解
多路复用(Multiplexing)和多路分解(Demultiplexing),将网络层提供的主机到主机的交付服务延伸到了为运行在主机上的应用程序提供进程到进程的交付服务。
多路分解:将运输层报文段中的数据交付到正确的套接字。
多路复用:将源主机不同套接字中的数据块封装首部信息,并生成报文段传递到网络的一系列过程。
无连接的复用与分解(面向UDP)
利用端口号创建 Socket
DatagramSocket mySocket1 = new DatagramSocket(99111);
UDP 的 Socket 用二元组表示
(目的 IP,目的端口号)
主机收到 UDP 段后
检查段中的 ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2020/05/01/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E5%B1%82/" title="计算机网络应用层"> <img class="post_bg" data-lazy-src="https://i.loli.net/2020/08/31/JPSdKkEU3Mvqzio.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="计算机网络应用层"></a></div><div class="recent-post-info"><a class="article-title" href="/2020/05/01/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E5%B1%82/" title="计算机网络应用层">计算机网络应用层</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2020-05-01T06:56:33.000Z" title="发表于 2020-05-01 14:56:33">2020-05-01</time></span><span class="article-meta"><span class="article-meta__separator">|</span><i class="fas fa-inbox article-meta__icon"></i><a class="article-meta__categories" href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/">计算机网络</a></span></div><div class="content">所谓应用层,便是指生活中一些基础的应用所处的层次,也就是我们日常所能够看到的,诸如 Web 网页,电子邮件等这些基础的应用所使用的协议。
本篇内容,主要说说最为重要、最为基础的 HTTP 协议。
HTTP协议
我们所浏览的 Web 网页,其主要是基于 HTTP 协议所搭建的。
HTTP 协议,英文全称为 Hyper Text Transfer Protocol (超文本传输协议),其是一种双端协议,也就是说,这个协议是有两个版本的,一个是服务端的协议一个是客户端的协议。
正如 Computer Networking, A Top-Down Approach 中所说的那样:HTTP defines how Web clients request Web pages from Web servers and how servers transfer Web pages to clients. HTTP 定义了 Web 客户端如何从 Web 服务器请求网页以及 Web 服务器如何向 Web 客户端传输结果。
HTTP报文格式
HTTP 规范包含了对HTTP报文格式的定义,正 ...</div></div></div><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2020/04/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%A6%82%E8%BF%B0/" title="计算机网络概述"> <img class="post_bg" data-lazy-src="https://i.loli.net/2020/08/31/JPSdKkEU3Mvqzio.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="计算机网络概述"></a></div><div class="recent-post-info"><a class="article-title" href="/2020/04/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%A6%82%E8%BF%B0/" title="计算机网络概述">计算机网络概述</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2020-04-27T06:11:39.000Z" title="发表于 2020-04-27 14:11:39">2020-04-27</time></span><span class="article-meta"><span class="article-meta__separator">|</span><i class="fas fa-inbox article-meta__icon"></i><a class="article-meta__categories" href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/">计算机网络</a></span></div><div class="content">所谓二十一世纪是生物的世纪,在生物的曙光还未照亮之际,我们的生活却实实在在地被计算机所改变,被计算机网络所改变。
计算机网络,现今,通过光纤将许许多多计算机组在一起,以联通你和世界;通过互联网协议,使数据可以“安全稳定”地传输、解析,将一条条信息送到你眼前。
OSI服务参考模型
OSI参考模型是一种计算机网络的理论模型,其按照功能将计算机网络自上而下分为了 7 层:
应用层:主要是一些服务/协议,用于完成某项特殊功能
文件传输协议:FTP
电子邮件协议:SMTP
表示层:用于处理两个系统之间交换信息的语法与语义问题
信息的加密与解密
信息的压缩与解压
会话层:用于会话控制
建立、维护会话
传输层:负责源-目的(端到端)(进程间)完整的报文传输
分段与重组
连接、流量、差错控制等
网络层:控制子网运行,将网络地址翻译为物理地址
逻辑编址
分组传输,路由选择等
数据链路层:负责节点到节点的数据传输
物理寻址
连接、流量、差错控制等
物理层:指定物理底层的标准
接口标准:形状、电压等
编 ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2020/01/10/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E7%BB%86%E5%88%99/" title="二分查找细则"> <img class="post_bg" data-lazy-src="https://i.loli.net/2020/08/30/rKtH1fxmLVdzJTl.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="二分查找细则"></a></div><div class="recent-post-info"><a class="article-title" href="/2020/01/10/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E7%BB%86%E5%88%99/" title="二分查找细则">二分查找细则</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2020-01-10T13:47:55.000Z" title="发表于 2020-01-10 21:47:55">2020-01-10</time></span></div><div class="content">关于二分查找
二分查找或许是很多人学习的第一个算法,其简洁明快,但是在实际应用中,你却会看到许多种写法的二分查找,而这些写法,仅是细节处的区别。
这些不同写法的二分查找,究竟哪一个才是正确的?还是,无论怎么写,达到目的便可以称之为二分查找?
常规写法一
1234567891011121314public static int bSearch(int[] arr, int start, int end, int key){ while (start <= end){ // 防止溢位 int mid = start + (end - start)/2; if (arr[mid] == key) return mid; if (arr[mid] > key) end = mid - 1; else start = mid + 1; } return -1;}
这种写法便是我所学习的,或许也是大多数 ...</div></div></div><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2019/11/22/%E8%8A%B1%E9%87%8C%E8%83%A1%E5%93%A8%E7%9A%84%E4%BD%8D%E8%BF%90%E7%AE%97/" title="花里胡哨的位运算"> <img class="post_bg" data-lazy-src="https://i.loli.net/2020/08/30/rKtH1fxmLVdzJTl.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="花里胡哨的位运算"></a></div><div class="recent-post-info"><a class="article-title" href="/2019/11/22/%E8%8A%B1%E9%87%8C%E8%83%A1%E5%93%A8%E7%9A%84%E4%BD%8D%E8%BF%90%E7%AE%97/" title="花里胡哨的位运算">花里胡哨的位运算</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2019-11-22T10:45:25.000Z" title="发表于 2019-11-22 18:45:25">2019-11-22</time></span></div><div class="content">位运算,虽然说是一种十分精妙的算法技巧,但是除了花里胡哨好像并不能大幅提升时间复杂度。虽说如此,但不得不说,位运算的诸多技巧还是非常有趣的!
初识位运算
初次见到位运算的应用,那是在一个夏天的下午,有同学在班群问:“如何写交换函数?”不久,有人贴了这么段代码:
12345void swap(int* a, int* b) { *a ^= *b; *b ^= *a; *a ^= *b;}
我一脸懵,这都行?这是怎么交换的?异或还能这么使?记得那天我在草稿纸上花了半天,才搞懂了个大概:
我们以 3 和 6 为例:
1234初始状态时: a = 3 = 011 b = 6 = 110第一句执行: a = 101 b = 110第二句执行: a = 101 b = 011 = 3第三局执行: a = 110 = 6 b = 011 = 3
确实交换过来了,但为啥呢?但其实,我们可以将 ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2019/11/15/%E7%B4%A0%E6%95%B0%E7%AD%9B/" title="素数筛"> <img class="post_bg" data-lazy-src="https://i.loli.net/2020/08/30/rKtH1fxmLVdzJTl.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="素数筛"></a></div><div class="recent-post-info"><a class="article-title" href="/2019/11/15/%E7%B4%A0%E6%95%B0%E7%AD%9B/" title="素数筛">素数筛</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2019-11-15T11:49:46.000Z" title="发表于 2019-11-15 19:49:46">2019-11-15</time></span></div><div class="content">素数是一种作业或竞赛中较易考察的知识点,但好像在实际开发中用的不多【素数好像更多地用在网安领域】。总归,求取 a~b 之间的素数还是一种比较基本的算法技巧。
新手求素数
想当年,我刚学C语言的时候,便是这么写的,也就是直接暴力枚举:
1234567891011121314int count;int prime[MAX_N]; void getPrime(int a, int b) { count = 0; int j; for (int i = a; i <= b; ++i) { for (j = 2; j < i; ++j) { if (i % j == 0) break; } if (j == i) prime[count++] = i; }}
那时的我也还想到了比如 2*3=6 和 3*2=6 是等价的,所以判断素数的终止条件可以再压缩,也就是:
1for (j = 2; j < ...</div></div></div><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2019/11/04/Java%E9%9B%86%E5%90%88%E6%A6%82%E8%BF%B0/" title="Java集合概述"> <img class="post_bg" data-lazy-src="https://i.loli.net/2020/08/30/rKtH1fxmLVdzJTl.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Java集合概述"></a></div><div class="recent-post-info"><a class="article-title" href="/2019/11/04/Java%E9%9B%86%E5%90%88%E6%A6%82%E8%BF%B0/" title="Java集合概述">Java集合概述</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2019-11-04T14:33:40.000Z" title="发表于 2019-11-04 22:33:40">2019-11-04</time></span></div><div class="content">Java 集合是一种非常常用的容器,就像数组那样,是为了储存各种各样的数据类型或者数据结构而设计的。其包含了各种已经封装好的数据结构,比如栈,队列,封装好的“数组”等等。
Collection 接口
Collection 接口是最为基本的集合接口,也是相对比较高级的接口,其下又实现了一些子接口。
Set 子接口
Set 子接口最显著的特征就是置入其中的数据是“无序”且不可重复的。这种无序指的是其中存储的数据可能并不是按照你输入的顺序存储的,而是以其独有的方式进行排列的。而 Set 中的一些数据结构,是直接利用了 Map 中的数据结构实现的。
HashSet 类
HashSet 虽然是基于 HashMap 实现的,但其最底层所应用的便是我们数据结构中所学习的哈希表,有也就是说其底层实际上是利用哈希函数存储的,而这样的存储方式,也使得其查找,插入,删除等操作的时间复杂度可以降为 \(\Theta (1)\) 。
常见操作的示例代码如下:
123456789101112131415public static void main(String[] args) { ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2019/10/31/%E5%A0%86%E7%9A%84%E5%BA%94%E7%94%A8/" title="堆的应用"> <img class="post_bg" data-lazy-src="https://i.loli.net/2020/08/31/Z9bpedACOjFRYHo.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="堆的应用"></a></div><div class="recent-post-info"><a class="article-title" href="/2019/10/31/%E5%A0%86%E7%9A%84%E5%BA%94%E7%94%A8/" title="堆的应用">堆的应用</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2019-10-31T05:21:29.000Z" title="发表于 2019-10-31 13:21:29">2019-10-31</time></span><span class="article-meta"><span class="article-meta__separator">|</span><i class="fas fa-inbox article-meta__icon"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构</a></span></div><div class="content">书接上文,上篇博客中我说明了堆的定义,那么这一篇就谈谈堆的用法。由于堆快速的增删特性,所以往往有以下重要用途:
实现优先队列,用于启发式搜索等内容。
一般用于贪心算法中辅助的数据结构。
堆的使用
堆固然好用,但是也要清楚如何使用。
快速手写堆
库固然好用,但是某些情况下你却可能不得不手写堆,那么这时候掌握快速手写堆的技巧便显得尤为重要。
数组是“万能的”,所以一般仅需要一个数组,便能够表示一个堆。众所周知,我们的堆是使用完全二叉树表示的,如下所示:
最小堆.png
我们可以发现,可以将二叉树依次对应到数组中:
数组下标
0
1
2
3
4
数组的值
2
5
4
7
8
可以发现,某个节点的根,实际上就是该节点下标的一半【这也是上个博客实现堆的时候使用的具体原理】。
知道了数组与完全二叉树的对应关系,那么便有可以自己实现最小堆,代码1如下:
12345678910111213141516171819202122232425262728293031323334353637383940 ...</div></div></div><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2019/10/30/%E5%A0%86/" title="堆"> <img class="post_bg" data-lazy-src="https://i.loli.net/2020/08/31/Z9bpedACOjFRYHo.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="堆"></a></div><div class="recent-post-info"><a class="article-title" href="/2019/10/30/%E5%A0%86/" title="堆">堆</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2019-10-30T09:18:21.000Z" title="发表于 2019-10-30 17:18:21">2019-10-30</time></span><span class="article-meta"><span class="article-meta__separator">|</span><i class="fas fa-inbox article-meta__icon"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构</a></span></div><div class="content">引例:在搜索算法实现中,会遇到这样一个问题——我们并不希望按照入队的先后顺序出队,而是希望每次出队的都是队列中最大或最小的元素。
而要实现这样的方式,我们可以假设一种队列,取出元素的顺序以大小为准,我们往往将这样的队列称之为优先队列。
优先队列(Priority Queue):特殊的“队列”,依照元素的优先权(关键字)大小取出数据,而不是元素进入队列的先后顺序。
选择合适的数据结构
既然已经有了这样一个设想,那我们应该采用何种方式来实现呢?
使用数组或者链表
我们首先会想到以前学过的基本内容,以数组,链表等方式来储存,为了方便判断各种储存方法的优劣,我们将几种方法的时间复杂度进行比较。
普通数组
插入:我们只需要将普通数组的尾部即可 —— 时间复杂度 O(1)
删除:需要从数组中查找最大或最小的元素,进行一次遍历即可 —— 时间复杂度为 O(n)
链表
插入:元素总是插在链表的头部(头插法) —— 时间复杂度 O(1)
删除:同样需要遍历查找查找最大或最小元素 —— 时间复杂度 O(1)
有序数组:即在插入时就按照一定顺序插入 ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2019/10/29/%E5%8D%9A%E5%AE%A2%E9%87%8D%E6%96%B0%E9%85%8D%E7%BD%AE/" title="博客重新配置"> <img class="post_bg" data-lazy-src="https://i.loli.net/2020/08/30/rKtH1fxmLVdzJTl.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="博客重新配置"></a></div><div class="recent-post-info"><a class="article-title" href="/2019/10/29/%E5%8D%9A%E5%AE%A2%E9%87%8D%E6%96%B0%E9%85%8D%E7%BD%AE/" title="博客重新配置">博客重新配置</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2019-10-29T08:16:27.000Z" title="发表于 2019-10-29 16:16:27">2019-10-29</time></span></div><div class="content">之前用的 yilia 主题的作者跑路了,好久都没更新了,这导致我以前好不容易搞好的博客开始出现了一些有的没的小问题:标签搜索时有时无,赞赏二维码被压缩至一侧等等。但由于种种原因,也一直懒得再搞一个新主题,昨晚突然心血来潮,找了找新一点的主题,最终相中了 icarus。
icarus 是那种很干净的主题,虽然简洁度比着 yilia 差了一些,但也多了不少内容,加了许些动画。
主题安装
根据 gitbub 上的说明,切换到主目录下执行下面命令即可。
1git clone https://github.com/ppoffice/hexo-theme-icarus.git themes/icarus
完成后,更改了 _config.yml 文件,将主题换了过来,并 hexo g。正在我拿起手机准备等待其配置的时候,不幸的故事发生了,是的,报错了:
1fs.SyncWriteStream is deprecated.
就这么一句报错,我搜了一个晚上,经过数次尝试后未果。
第二天起了个大早——十点多就起了,我改变了我的思路,因为 ...</div></div></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><span class="space">…</span><a class="page-number" href="/page/5/">5</a><a class="extend next" rel="next" href="/page/2/"><i class="fas fa-chevron-right fa-fw"></i></a></div></nav></div><div class="aside_content" id="aside_content"><div class="card-widget card-info"><div class="card-content"><div class="card-info-avatar is-center"><img class="avatar-img" data-lazy-src="/image/avatar.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/><div class="author-info__name">文盲</div><div class="author-info__description"></div></div><div class="card-info-data"><div class="card-info-data-item is-center"><a href="/archives/"><div class="headline">文章</div><div class="length_num">50</div></a></div><div class="card-info-data-item is-center"><a href="/tags/"><div class="headline">标签</div><div class="length_num">23</div></a></div><div class="card-info-data-item is-center"><a href="/categories/"><div class="headline">分类</div><div class="length_num">2</div></a></div></div><a class="button--animated" id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/wenmang"><i class="fab fa-github"></i><span>Follow Me</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="https://github.com/wenmang" target="_blank" title="Github"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:[email protected]" target="_blank" title="Email"><i class="fas fa-envelope"></i></a><a class="social-icon" href="https://wenmang.github.io" target="_blank" title="Rss"><i class="fas fa-rss"></i></a></div></div></div><div class="sticky_layout"><div class="card-widget card-announcement"><div class="card-content"><div class="item-headline"><i class="fas fa-bullhorn card-announcement-animation"></i><span>公告</span></div><div class="announcement_content">我的博客</div></div></div><div class="card-widget card-recent-post"><div class="card-content"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/2020/08/30/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E4%BC%A0%E8%BE%93%E5%B1%82/" title="计算机网络传输层"><img data-lazy-src="https://i.loli.net/2020/08/31/JPSdKkEU3Mvqzio.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="计算机网络传输层"/></a><div class="content"><a class="title" href="/2020/08/30/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E4%BC%A0%E8%BE%93%E5%B1%82/" title="计算机网络传输层">计算机网络传输层</a><time datetime="2020-08-30T07:36:13.000Z" title="发表于 2020-08-30 15:36:13">2020-08-30</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2020/05/01/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E5%B1%82/" title="计算机网络应用层"><img data-lazy-src="https://i.loli.net/2020/08/31/JPSdKkEU3Mvqzio.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="计算机网络应用层"/></a><div class="content"><a class="title" href="/2020/05/01/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E5%B1%82/" title="计算机网络应用层">计算机网络应用层</a><time datetime="2020-05-01T06:56:33.000Z" title="发表于 2020-05-01 14:56:33">2020-05-01</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2020/04/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%A6%82%E8%BF%B0/" title="计算机网络概述"><img data-lazy-src="https://i.loli.net/2020/08/31/JPSdKkEU3Mvqzio.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="计算机网络概述"/></a><div class="content"><a class="title" href="/2020/04/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%A6%82%E8%BF%B0/" title="计算机网络概述">计算机网络概述</a><time datetime="2020-04-27T06:11:39.000Z" title="发表于 2020-04-27 14:11:39">2020-04-27</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2020/01/10/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E7%BB%86%E5%88%99/" title="二分查找细则"><img data-lazy-src="https://i.loli.net/2020/08/30/rKtH1fxmLVdzJTl.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="二分查找细则"/></a><div class="content"><a class="title" href="/2020/01/10/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E7%BB%86%E5%88%99/" title="二分查找细则">二分查找细则</a><time datetime="2020-01-10T13:47:55.000Z" title="发表于 2020-01-10 21:47:55">2020-01-10</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2019/11/22/%E8%8A%B1%E9%87%8C%E8%83%A1%E5%93%A8%E7%9A%84%E4%BD%8D%E8%BF%90%E7%AE%97/" title="花里胡哨的位运算"><img data-lazy-src="https://i.loli.net/2020/08/30/rKtH1fxmLVdzJTl.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="花里胡哨的位运算"/></a><div class="content"><a class="title" href="/2019/11/22/%E8%8A%B1%E9%87%8C%E8%83%A1%E5%93%A8%E7%9A%84%E4%BD%8D%E8%BF%90%E7%AE%97/" title="花里胡哨的位运算">花里胡哨的位运算</a><time datetime="2019-11-22T10:45:25.000Z" title="发表于 2019-11-22 18:45:25">2019-11-22</time></div></div></div></div></div><div class="card-widget card-categories"><div class="card-content"><div class="item-headline"><i class="fas fa-folder-open"></i><span>分类</span></div><ul class="card-category-list">
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"><span class="card-category-list-name">数据结构</span><span class="card-category-list-count">24</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"><span class="card-category-list-name">计算机网络</span><span class="card-category-list-count">3</span></a></li>
</ul></div></div><div class="card-widget card-tags"><div class="card-content"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/AI/" style="font-size: 1.1em; color: #999">AI</a> <a href="/tags/C/" style="font-size: 1.17em; color: #999c9f">C</a> <a href="/tags/C%E8%AF%AD%E8%A8%80/" style="font-size: 1.3em; color: #99a1ac">C语言</a> <a href="/tags/Java/" style="font-size: 1.1em; color: #999">Java</a> <a href="/tags/c/" style="font-size: 1.1em; color: #999">c</a> <a href="/tags/python/" style="font-size: 1.1em; color: #999">python</a> <a href="/tags/%E5%88%B7%E9%A2%98/" style="font-size: 1.17em; color: #999c9f">刷题</a> <a href="/tags/%E5%8D%9A%E5%AE%A2/" style="font-size: 1.43em; color: #99a6b9">博客</a> <a href="/tags/%E5%B0%8F%E6%B8%B8%E6%88%8F/" style="font-size: 1.1em; color: #999">小游戏</a> <a href="/tags/%E5%BA%95%E5%B1%82/" style="font-size: 1.3em; color: #99a1ac">底层</a> <a href="/tags/%E6%95%99%E7%A8%8B/" style="font-size: 1.17em; color: #999c9f">教程</a> <a href="/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" style="font-size: 1.5em; color: #99a9bf">数据结构</a> <a href="/tags/%E6%9C%89%E8%B6%A3/" style="font-size: 1.1em; color: #999">有趣</a> <a href="/tags/%E6%A8%A1%E5%BC%8F%E8%AF%86%E5%88%AB/" style="font-size: 1.1em; color: #999">模式识别</a> <a href="/tags/%E7%AE%97%E6%B3%95/" style="font-size: 1.23em; color: #999ea6">算法</a> <a href="/tags/%E7%AE%97%E6%B3%95%E5%9F%BA%E7%A1%80/" style="font-size: 1.17em; color: #999c9f">算法基础</a> <a href="/tags/%E7%AE%97%E6%B3%95%E6%80%9D%E6%83%B3/" style="font-size: 1.1em; color: #999">算法思想</a> <a href="/tags/%E7%AE%97%E6%B3%95%E6%8A%80%E5%B7%A7/" style="font-size: 1.23em; color: #999ea6">算法技巧</a> <a href="/tags/%E7%BB%83%E4%B9%A0/" style="font-size: 1.17em; color: #999c9f">练习</a> <a href="/tags/%E7%BB%86%E8%8A%82/" style="font-size: 1.1em; color: #999">细节</a> <a href="/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/" style="font-size: 1.23em; color: #999ea6">计算机网络</a> <a href="/tags/%E9%93%BE%E8%A1%A8/" style="font-size: 1.17em; color: #999c9f">链表</a> <a href="/tags/%E9%9A%8F%E7%AC%94/" style="font-size: 1.37em; color: #99a4b2">随笔</a></div></div></div><div class="card-widget card-archives"><div class="card-content"><div class="item-headline"><i class="fas fa-archive"></i><span>归档</span></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/08/"><span class="card-archive-list-date">八月 2020</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/05/"><span class="card-archive-list-date">五月 2020</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/04/"><span class="card-archive-list-date">四月 2020</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/01/"><span class="card-archive-list-date">一月 2020</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2019/11/"><span class="card-archive-list-date">十一月 2019</span><span class="card-archive-list-count">3</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2019/10/"><span class="card-archive-list-date">十月 2019</span><span class="card-archive-list-count">6</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2019/09/"><span class="card-archive-list-date">九月 2019</span><span class="card-archive-list-count">4</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2019/08/"><span class="card-archive-list-date">八月 2019</span><span class="card-archive-list-count">3</span></a></li><li class="card-archive-list-item more is-center"><a class="card-archive-list-link-more" href="/archives">
<span>查看更多</span><i class="fas fa-angle-right" ></i></a></li></ul></div></div></div></div></main><footer id="footer" data-type="color"><div id="footer-wrap"><div class="copyright">©2017 - 2020 By 文盲</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><section id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></section><div><script src="https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js"></script><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.js"></script><script src="https://cdn.jsdelivr.net/npm/instant.page/instantpage.min.js" type="module" defer></script><script src="https://cdn.jsdelivr.net/npm/vanilla-lazyload/dist/lazyload.iife.min.js" async></script><div class="js-pjax"><script>function subtitleType () {
if (true) {
var typed = new Typed("#subtitle", {
strings: "游戏已到了关底,空虚是最后结局".split(","),
startDelay: 300,
typeSpeed: 150,
loop: true,
backSpeed: 50
})
} else {
document.getElementById("subtitle").innerHTML = '游'
}
}
if (true) {
if (typeof Typed === 'function') subtitleType()
else $.getScript('https://cdn.jsdelivr.net/npm/typed.js/lib/typed.min.js', subtitleType)
} else {
subtitleType()
}</script><script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></div><!-- hexo-inject:begin --><!-- hexo-inject:end --></body></html>