From dceb79e19c11bfb65703c87c3397da363d155c84 Mon Sep 17 00:00:00 2001 From: xuyanbo03 Date: Sat, 18 Jul 2020 21:03:51 +0800 Subject: [PATCH 1/3] Site updated: 2020-07-18 21:03:50 --- 404.html | 8 +- about/index.html | 2 +- archives/index.html | 4 +- atom.xml | 14 +- baidu_verify_3NWlza1HUZ.html | 2 +- baidusitemap.xml | 2 +- categories/Java/index.html | 2 +- categories/blog/index.html | 2 +- categories/index.html | 2 +- categories/linux/index.html | 2 +- categories/web/index.html | 2 +- .../web\345\211\215\347\253\257/index.html" | 2 +- .../\345\211\215\347\253\257/index.html" | 4 +- .../index.html" | 2 +- .../\345\267\245\345\205\267/index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../\347\256\227\346\263\225/index.html" | 2 +- css/main.css | 2 +- guestbook/index.html | 2 +- index.html | 10 +- page/2/index.html | 2 +- page/3/index.html | 2 +- page/4/index.html | 2 +- posts/101d1957/index.html | 4 +- posts/13b6b7c2/index.html | 2 +- posts/143a0a72/index.html | 2 +- posts/1d6a9c79/index.html | 2 +- posts/1fad2db9/index.html | 2 +- posts/4370e84d/index.html | 2 +- posts/440e5582/index.html | 2 +- posts/4a17b156/index.html | 2 +- posts/6021eb27/index.html | 2 +- posts/62e0a87a/index.html | 2 +- posts/6bfb34d8/index.html | 8 +- posts/6eadcfba/index.html | 2 +- posts/742c7f0a/index.html | 4 +- posts/75c6e52f/index.html | 2 +- posts/7a7093e6/index.html | 2 +- posts/86ceb8f1/index.html | 2 +- posts/8786024c/index.html | 2 +- posts/8c3b0bac/index.html | 2 +- posts/948e1c93/index.html | 2 +- posts/a5b005af/index.html | 2 +- posts/a79c8cf7/index.html | 2 +- posts/bb07c3a7/index.html | 2 +- posts/bce46d0d/index.html | 2 +- posts/c0d60af6/index.html | 1570 +++++++++++++++++ posts/c1c013be/index.html | 2 +- posts/c96b08bc/index.html | 2 +- posts/cf0c10bf/index.html | 2 +- posts/d24e8921/index.html | 2 +- posts/db1de468/index.html | 134 +- posts/dd22b276/index.html | 2 +- posts/e20ef482/index.html | 8 +- posts/e6939326/index.html | 2 +- posts/e913391a/index.html | 2 +- posts/fd5cbc55/index.html | 2 +- search.xml | 6 +- sitemap.xml | 4 +- sw-register.js | 2 +- sw.js | 2 +- tags/Docker/index.html | 2 +- tags/ELK/index.html | 2 +- tags/FreeCodeCamp/index.html | 2 +- tags/HTML5/index.html | 2 +- tags/Hadoop/index.html | 2 +- tags/Java/index.html | 2 +- tags/Mac/index.html | 2 +- tags/MapReduce/index.html | 2 +- tags/MongoDB/index.html | 2 +- tags/MySQl/index.html | 2 +- tags/NLP/index.html | 2 +- tags/Ray/index.html | 2 +- tags/Windons/index.html | 2 +- tags/blog/index.html | 2 +- tags/css/index.html | 2 +- tags/html/index.html | 2 +- tags/index.html | 2 +- tags/javascript/index.html | 4 +- tags/kali/index.html | 2 +- tags/linux/index.html | 2 +- tags/seo/index.html | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- "tags/\347\256\227\346\263\225/index.html" | 2 +- .../index.html" | 2 +- "tags/\351\235\242\350\257\225/index.html" | 2 +- top/index.html | 2 +- 89 files changed, 1789 insertions(+), 143 deletions(-) create mode 100644 posts/c0d60af6/index.html diff --git a/404.html b/404.html index c3051613..998b533e 100644 --- a/404.html +++ b/404.html @@ -131,7 +131,7 @@ @@ -139,14 +139,14 @@ @@ -384,7 +384,7 @@

本文使用JavaScript实现一些常用的算法思想

算法思想

递归

1
2
3
4
5
6
7
8
//斐波那契数列:递归
function fibonacci(num) {
if (num===1||num===2) {
return 1;
}
return fibonacci(num-1)+fibonacci(num-2);
}

非递归

1
2
3
4
5
6
7
8
9
10
//斐波那契数列:非递归
function fib(num) {
var n1=1,n2=1,n=1;
for (var i = 3; i <= num; i++) {
n=n1+n2;
n1=n2;
n2=n;
}
return n;
}

动态规划

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
//动态规划:将大问题转化成小问题
//最少硬币找零问题:找到n所需的最小硬币数
function dpMinCoinChange(coins) {
var coins=coins;
var cache={};
this.makeChange=function (amount) {
var me=this;
if (!amount) {//判断为正
return [];
}
if (cache[amount]) {//判断是否有缓存
return cache[amount];
}
var min=[],newMin,newAmount;
for (var i = 0; i < coins.length; i++) {//对每个面额计算
var coin=coins[i];
newAmount=amount-coin;
if (newAmount>=0) {
newMin=me.makeChange(newAmount);
}
if (newAmount>=0 && (newMin.length<min.length-1 || !min.length)
&& (newMin.length || !newAmount)) {
//判断newAmount是否有效,最小硬币数是否最优,newMin和newAmount是否合理
min=[coin].concat(newMin);
console.log('new Min '+min+ ' for '+amount);
}
}
return (cache[amount]=min);
}
}

贪心策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//贪心算法:近似求解,通过局部最优达到全局最优
//最少硬币找零问题:找到n所需的最小硬币数
function txMinCoinChange(coins){
var coins=coins;
this.makeChange=function(amount){
var change=[],total=0;
for (var i = coins.length; i >= 0; i--) {//对每个面额从大面额开始,从大到小依次
var coin=coins[i];
while (total+coin<=amount) {
change.push(coin);
total+=coin;
}
}
return change;
}
}
]]> @@ -587,10 +587,10 @@ - - + + @@ -696,12 +696,12 @@ - - + + diff --git a/baidu_verify_3NWlza1HUZ.html b/baidu_verify_3NWlza1HUZ.html index 08558619..d8be5ad0 100644 --- a/baidu_verify_3NWlza1HUZ.html +++ b/baidu_verify_3NWlza1HUZ.html @@ -1292,7 +1292,7 @@

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 数据结构与算法JavaScript版(三) | Awebone's Blog + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+
+
+ + +
+ + + + + + + + +
+ + + +
+ + + + + + + +
+ + + +

数据结构与算法JavaScript版(三)

+ + + +
+ + + + + +
+ + + + + +
+

本文使用JavaScript实现一些常用的算法思想

+
+

算法思想

递归

1
2
3
4
5
6
7
8
//斐波那契数列:递归
function fibonacci(num) {
if (num===1||num===2) {
return 1;
}
return fibonacci(num-1)+fibonacci(num-2);
}
+ +

非递归

1
2
3
4
5
6
7
8
9
10
//斐波那契数列:非递归
function fib(num) {
var n1=1,n2=1,n=1;
for (var i = 3; i <= num; i++) {
n=n1+n2;
n1=n2;
n2=n;
}
return n;
}
+

动态规划

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
//动态规划:将大问题转化成小问题
//最少硬币找零问题:找到n所需的最小硬币数
function dpMinCoinChange(coins) {
var coins=coins;
var cache={};
this.makeChange=function (amount) {
var me=this;
if (!amount) {//判断为正
return [];
}
if (cache[amount]) {//判断是否有缓存
return cache[amount];
}
var min=[],newMin,newAmount;
for (var i = 0; i < coins.length; i++) {//对每个面额计算
var coin=coins[i];
newAmount=amount-coin;
if (newAmount>=0) {
newMin=me.makeChange(newAmount);
}
if (newAmount>=0 && (newMin.length<min.length-1 || !min.length)
&& (newMin.length || !newAmount)) {
//判断newAmount是否有效,最小硬币数是否最优,newMin和newAmount是否合理
min=[coin].concat(newMin);
console.log('new Min '+min+ ' for '+amount);
}
}
return (cache[amount]=min);
}
}
+

贪心策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//贪心算法:近似求解,通过局部最优达到全局最优
//最少硬币找零问题:找到n所需的最小硬币数
function txMinCoinChange(coins){
var coins=coins;
this.makeChange=function(amount){
var change=[],total=0;
for (var i = coins.length; i >= 0; i--) {//对每个面额从大面额开始,从大到小依次
var coin=coins[i];
while (total+coin<=amount) {
change.push(coin);
total+=coin;
}
}
return change;
}
}
+ + +
+ + + + +
+ +
+ +
-------------本文结束感谢您的阅读-------------
+ +
+ +
+ + + + + +

本文标题:数据结构与算法JavaScript版(三)

+

文章作者:Awebone

+

发布时间:2020年07月18日 - 15:07

+

最后更新:2020年07月18日 - 21:07

+

原始链接:https://www.awebone.com/posts/c0d60af6/ + +

+

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

+
+ + + +
+ + + + +
+
+
+ + +
+ +
+ + + + + +
+ + + +
+ + + +
+ +
+
+ + +
+ + + + + + + + + +
+ + + + + + + + + +
+
+ +
+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/posts/c1c013be/index.html b/posts/c1c013be/index.html index a0f8d1d5..5789b1b2 100644 --- a/posts/c1c013be/index.html +++ b/posts/c1c013be/index.html @@ -1612,7 +1612,7 @@

落子if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077201973') + navigator.serviceWorker.register('/sw.js?t=1595077393092') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/db1de468/index.html b/posts/db1de468/index.html index 71e9e5ee..9895fbcf 100644 --- a/posts/db1de468/index.html +++ b/posts/db1de468/index.html @@ -130,22 +130,42 @@ - +排序算法 +冒泡排序工作原理:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。 +算法描述: + +比较相邻的元素,如果第一个比第二个大,就交换它们两个 +对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数 +针对所有的元素重复以上的步骤,除了最"> - + - - +比较相邻的元素,如果第一个比第二个大,就交换它们两个 +对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数 +针对所有的元素重复以上的步骤,除了最"> + + - - + +比较相邻的元素,如果第一个比第二个大,就交换它们两个 +对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数 +针对所有的元素重复以上的步骤,除了最"> + @@ -181,7 +201,7 @@ - 数据结构与算法JavaScript版(三) | Awebone's Blog + 数据结构与算法JavaScript版(二) | Awebone's Blog @@ -390,7 +410,7 @@

见多方能识广,进而才 -

数据结构与算法JavaScript版(三)

+

数据结构与算法JavaScript版(二)

@@ -506,13 +526,73 @@

数据结构与算法JavaScript
-

本文使用JavaScript实现一些常用的算法思想

+

本文使用JavaScript实现基础排序算法和搜索算法

-

算法思想

递归

1
2
3
4
5
6
7
8
//斐波那契数列:递归
function fibonacci(num) {
if (num===1||num===2) {
return 1;
}
return fibonacci(num-1)+fibonacci(num-2);
}
+

排序算法

1595068515953

+

冒泡排序

工作原理:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

+

算法描述:

+
    +
  1. 比较相邻的元素,如果第一个比第二个大,就交换它们两个
  2. +
  3. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
  4. +
  5. 针对所有的元素重复以上的步骤,除了最后一个
  6. +
  7. 重复步骤1~3,直到排序完成。
  8. +
-

非递归

1
2
3
4
5
6
7
8
9
10
//斐波那契数列:非递归
function fib(num) {
var n1=1,n2=1,n=1;
for (var i = 3; i <= num; i++) {
n=n1+n2;
n1=n2;
n2=n;
}
return n;
}
-

动态规划

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
//动态规划:将大问题转化成小问题
//最少硬币找零问题:找到n所需的最小硬币数
function dpMinCoinChange(coins) {
var coins=coins;
var cache={};
this.makeChange=function (amount) {
var me=this;
if (!amount) {//判断为正
return [];
}
if (cache[amount]) {//判断是否有缓存
return cache[amount];
}
var min=[],newMin,newAmount;
for (var i = 0; i < coins.length; i++) {//对每个面额计算
var coin=coins[i];
newAmount=amount-coin;
if (newAmount>=0) {
newMin=me.makeChange(newAmount);
}
if (newAmount>=0 && (newMin.length<min.length-1 || !min.length)
&& (newMin.length || !newAmount)) {
//判断newAmount是否有效,最小硬币数是否最优,newMin和newAmount是否合理
min=[coin].concat(newMin);
console.log('new Min '+min+ ' for '+amount);
}
}
return (cache[amount]=min);
}
}
-

贪心策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//贪心算法:近似求解,通过局部最优达到全局最优
//最少硬币找零问题:找到n所需的最小硬币数
function txMinCoinChange(coins){
var coins=coins;
this.makeChange=function(amount){
var change=[],total=0;
for (var i = coins.length; i >= 0; i--) {//对每个面额从大面额开始,从大到小依次
var coin=coins[i];
while (total+coin<=amount) {
change.push(coin);
total+=coin;
}
}
return change;
}
}
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function bubbleSort(arr){
var len = arr.length;
if (len === 0){
return [];
}
for(var i = 0; i < len; i++) {
for(var j = 0; j < len - i; j++){
if(arr[j - 1] > arr[j]){
var tmp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = tmp;
}
}
}
return arr;
}
var arr = [5,3,6,4,3,9,7]
console.log(bubbleSort(arr))
+

选择排序

工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

+

算法描述如下:

+
    +
  1. 初始状态:无序区为R[1..n],有序区为空;
  2. +
  3. 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  4. +
  5. n-1趟结束,数组有序化了
  6. +
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { //寻找最小的数
minIndex = j; //将最小数的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(selectionSort(arr));
+

插入排序

工作原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

+

算法描述:

+
    +
  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. +
  3. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  4. +
  5. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  6. +
  7. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  8. +
  9. 将新元素插入到该位置后;
  10. +
  11. 重复步骤2~5
  12. +
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function insertionSort(array) {
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
for (var i = 1; i < array.length; i++) {
var key = array[i];
var j = i - 1;
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
return array;
} else {
return 'array is not an Array!';
}
}
+

改进插入排序: 查找插入位置时使用二分查找的方式

+
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
function binaryInsertionSort(array) {
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
for (var i = 1; i < array.length; i++) {
var key = array[i], left = 0, right = i - 1;
while (left <= right) {
var middle = parseInt((left + right) / 2);
if (key < array[middle]) {
right = middle - 1;
} else {
left = middle + 1;
}
}
for (var j = i - 1; j >= left; j--) {
array[j + 1] = array[j];
}
array[left] = key;
}
return array;
} else {
return 'array is not an Array!';
}
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(binaryInsertionSort(arr));
+

归并排序

工作原理:归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

+

算法描述:

+
    +
  1. 把长度为n的输入序列分成两个长度为n/2的子序列;
  2. +
  3. 对这两个子序列分别采用归并排序;
  4. +
  5. 将两个排序好的子序列合并成一个最终的排序序列
  6. +
+
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
function mergeSort(arr) { //采用自上而下的递归方法
var len = arr.length;
if(len < 2) {
return arr;
}
var middle = Math.floor(len / 2),
left = arr.slice(0, middle),
right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right){
var result = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
while (left.length)
result.push(left.shift());
while (right.length)
result.push(right.shift());
return result;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(mergeSort(arr));
+

快速排序

工作原理:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

+

算法描述:

+
    +
  1. 从数列中挑出一个元素,称为 “基准”(pivot);
  2. +
  3. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  4. +
  5. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
  6. +
+
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
function quickSort(array, left, right) {
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array' && typeof left === 'number' && typeof right === 'number') {
if (left < right) {
var x = array[right], i = left - 1, temp;
for (var j = left; j <= right; j++) {
if (array[j] <= x) {
i++;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
quickSort(array, left, i - 1);
quickSort(array, i + 1, right);
}
return array;
} else {
return 'array is not an Array or left or right is not a number!';
}
}
//更好理解的方法
var quickSort2 = function(arr) {
if (arr.length <= 1)
return arr;
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort2(left).concat([pivot], quickSort2(right));
};
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(quickSort(arr,0,arr.length-1));
console.log(quickSort2(arr));
+

堆排序

堆排序(Heapsort):利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

+

算法描述:

+
    +
  1. 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
  2. +
  3. 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
  4. +
  5. 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成
  6. +
+
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
function heapSort(array) {
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
//建堆
var heapSize = array.length, temp;
for (var i = Math.floor(heapSize / 2) - 1; i >= 0; i--) {
heapify(array, i, heapSize);
}
//堆排序
for (var j = heapSize - 1; j >= 1; j--) {
temp = array[0];
array[0] = array[j];
array[j] = temp;
heapify(array, 0, --heapSize);
}
return array;
} else {
return 'array is not an Array!';
}
}
function heapify(arr, x, len) {
if (Object.prototype.toString.call(arr).slice(8, -1) === 'Array' && typeof x === 'number') {
var l = 2 * x + 1, r = 2 * x + 2, largest = x, temp;
if (l < len && arr[l] > arr[largest]) {
largest = l;
}
if (r < len && arr[r] > arr[largest]) {
largest = r;
}
if (largest != x) {
temp = arr[x];
arr[x] = arr[largest];
arr[largest] = temp;
heapify(arr, largest, len);
}
} else {
return 'arr is not an Array or x is not a number!';
}
}
var arr=[91,60,96,13,35,65,46,65,10,30,20,31,77,81,22];
console.log(heapSort(arr));
+


+

搜索算法

顺序或线性搜索

最简单的搜索

+

工作原理:从左往右遍历寻找,返回索引

+
1
2
3
4
5
6
7
8
9
10
11
function sequentialSearch(array, item){
for (var i = 0; i < array.length; i++) {
if (item === array[i]) {
return i;
}
}
return -1;
}
var arr=[91,60,96,13,35,65,46,65,10,30,20,31,77,81,22];
console.log(sequentialSearch(arr, 91));
+

二分搜索

二分查找的前提为:数组、有序。逻辑为:优先和数组的中间元素比较,如果等于中间元素,则直接返回。如果不等于则取半继续查找。

+
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
//递归
function binarySearch(arr, item, left, right) {
if (left > right)
return -1;
var start = left || 0;
var end = right || arr.length - 1;
var mid = parseInt(start + (end - start) / 2);
if(item == arr[mid]){
return mid;
}else if(item > arr[mid]){
return binarySearch(arr, item, mid + 1, end);
}else{
return binarySearch(arr, item, start, mid - 1);
}
return -1;
}
//非递归
function binarySearch2(arr, item) {
var left = 0;
var right = arr.length - 1;
while (left <= right){
var mid = parseInt(left + (right - left) / 2);
if(item == arr[mid]){
return mid;
}else if(item > arr[mid]){
left = mid + 1;
}else{
right = mid - 1;
}
}
return -1;
}
var arr=[13,35,46,65,77,81];
console.log(binarySearch(arr, 35));
console.log(binarySearch2(arr, 35));
+


+

参考链接

https://juejin.im/post/57dcd394a22b9d00610c5ec8

+

https://www.jianshu.com/p/eef65b21ace0

-

本文标题:数据结构与算法JavaScript版(三)

+

本文标题:数据结构与算法JavaScript版(二)

文章作者:Awebone

发布时间:2020年07月18日 - 15:07

最后更新:2020年07月18日 - 20:07

-

原始链接:https://www.awebone.com/posts/db1de468/ +

原始链接:https://www.awebone.com/posts/db1de468/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

@@ -625,8 +705,8 @@

-
@@ -635,10 +715,6 @@

- - @@ -868,7 +944,7 @@

+
@@ -1562,7 +1638,7 @@

if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077201973') + navigator.serviceWorker.register('/sw.js?t=1595077393092') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/e20ef482/index.html b/posts/e20ef482/index.html index 8c0b1709..47bd495d 100644 --- a/posts/e20ef482/index.html +++ b/posts/e20ef482/index.html @@ -117,7 +117,7 @@ - + @@ -851,10 +851,10 @@

- - + + @@ -1803,7 +1803,7 @@

应用if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077201973') + navigator.serviceWorker.register('/sw.js?t=1595077393092') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/e913391a/index.html b/posts/e913391a/index.html index f3dd7f58..8916cf6a 100644 --- a/posts/e913391a/index.html +++ b/posts/e913391a/index.html @@ -1604,7 +1604,7 @@

总结if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077201973') + navigator.serviceWorker.register('/sw.js?t=1595077393092') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/fd5cbc55/index.html b/posts/fd5cbc55/index.html index b97c3d38..1d122894 100644 --- a/posts/fd5cbc55/index.html +++ b/posts/fd5cbc55/index.html @@ -1582,7 +1582,7 @@

本文使用JavaScript实现一些常用的算法思想

@@ -2115,8 +2115,8 @@ age smallint web - 计算机基础知识 FreeCodeCamp + 计算机基础知识 @@ -2593,9 +2593,9 @@ age smallint CSS - FreeCodeCamp HTML JavaScript + FreeCodeCamp diff --git a/sitemap.xml b/sitemap.xml index e0630878..e55556ef 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,9 +2,9 @@ - https://www.awebone.com/posts/db1de468/ + https://www.awebone.com/posts/c0d60af6/ - 2020-07-18T12:59:35.505Z + 2020-07-18T13:03:00.335Z diff --git a/sw-register.js b/sw-register.js index 2968f18d..e58111a9 100644 --- a/sw-register.js +++ b/sw-register.js @@ -1 +1 @@ -navigator.serviceWorker&&navigator.serviceWorker.register('/sw.js?v=20200718205959').then(function(){navigator.serviceWorker.addEventListener('message',function(a){if('sw.update'===a.data){let a=document.querySelector('meta[name=theme-color]'),b=document.createElement('div');a&&(a.content='#000'),b.innerHTML='
\u70B9\u51FB\u5237\u65B0
',document.body.appendChild(b),setTimeout(function(){document.getElementById('app-refresh').className+=' app-refresh-show'},16)}})}); \ No newline at end of file +navigator.serviceWorker&&navigator.serviceWorker.register('/sw.js?v=20200718210310').then(function(){navigator.serviceWorker.addEventListener('message',function(a){if('sw.update'===a.data){let a=document.querySelector('meta[name=theme-color]'),b=document.createElement('div');a&&(a.content='#000'),b.innerHTML='
\u70B9\u51FB\u5237\u65B0
',document.body.appendChild(b),setTimeout(function(){document.getElementById('app-refresh').className+=' app-refresh-show'},16)}})}); \ No newline at end of file diff --git a/sw.js b/sw.js index 2e811b58..d6d2a6c7 100644 --- a/sw.js +++ b/sw.js @@ -28,7 +28,7 @@ var precacheUrls = []; precacheUrls.push('/posts/742c7f0a/'); - precacheUrls.push('/posts/db1de468/'); + precacheUrls.push('/posts/c0d60af6/'); precacheUrls.push('/posts/101d1957/'); diff --git a/tags/Docker/index.html b/tags/Docker/index.html index 544593e0..6be60ddb 100644 --- a/tags/Docker/index.html +++ b/tags/Docker/index.html @@ -1305,7 +1305,7 @@

diff --git a/about/index.html b/about/index.html index 1ee1082b..982af41d 100644 --- a/about/index.html +++ b/about/index.html @@ -578,7 +578,7 @@

- 34 + 35 日志 @@ -771,7 +771,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -788,7 +788,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1881,7 +1918,7 @@

- 50.5k + 50.8k --> @@ -1898,7 +1935,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -2546,7 +2583,7 @@

本文记录Docker容器和K8S集群中一些监控命令。

Docker基本监控

自带常用命令

  • docker ps -a:查看进程
  • docker top 容器id:查看容器资源利用
  • docker status:实时查看容器资源

图形化工具weavescope

部署

1
2
3
sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod +x /usr/local/bin/scope
scope launch 本机ip


K8S监控

计算资源分析与监控工具:heapster + dashboard + grafana

部署:下载heapster 包,进入deploy目录,修改相关yaml文件,启动。

集群自动伸缩设置

集群cpu或内存达到一定峰值,自动扩容pod

1596177920787

启用heapster,然后在集群启动时获取cpu利用率等情况,运行以下命令:

1
2
3
minikube addons enable heapster
minikube addons list
minikube start --extra-config=controller-manager.HorizontalPodAutoscalerUseRESTClients=false

1596179129619

然后按照官方文档设置水平扩展,cpu利用率超过50%即扩展,机器最少1台,最多10台

1
2
3
4
kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
kubectl get deployment php-apache
kubectl get horizontalpodautoscaler


log采集和展示:ELK+Fluentd

部署

1
2
3
4
kubectl get node
kubectl label node --all beta.kubernetes.io/fluentd-ds-ready=true
kubectl create -f logging/
kubectl get svc --namespace=kube-system


K8S集群监控方案:婆罗米修斯Prometheus

部署

1
2
3
4
kubectl get node
kubectl create -f prometheus/
kubectl get svc
kubectl get pod -o wide


]]> + + + + <blockquote> +<p>本文记录Docker容器和K8S集群中一些监控命令。</p> +</blockquote> +<h1 id="Docker基本监控"><a href="#Docker基本监控" class="headerlink" title="Docker基本监控"></a>Docker基本监控</h1><p><strong>自带常用命令</strong></p> +<ul> +<li><code>docker ps -a</code>:查看进程</li> +<li><code>docker top 容器id</code>:查看容器资源利用</li> +<li><code>docker status</code>:实时查看容器资源</li> +</ul> +<p><strong>图形化工具weavescope</strong></p> +<p>部署</p> +<figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">sudo curl -L git.io/scope -o /usr/<span class="built_in">local</span>/bin/scope</div><div class="line">sudo chmod +x /usr/<span class="built_in">local</span>/bin/scope</div><div class="line">scope launch 本机ip</div></pre></td></tr></tbody></table></figure> + + + + + + + + + + 数据结构与算法JavaScript版(二) @@ -84,7 +117,7 @@ https://www.awebone.com/posts/c0d60af6/ 2020-07-18T07:00:00.000Z - 2020-07-18T13:03:00.335Z + 2020-07-18T13:03:14.242Z

本文使用JavaScript实现一些常用的算法思想

算法思想

递归

1
2
3
4
5
6
7
8
//斐波那契数列:递归
function fibonacci(num) {
if (num===1||num===2) {
return 1;
}
return fibonacci(num-1)+fibonacci(num-2);
}

非递归

1
2
3
4
5
6
7
8
9
10
//斐波那契数列:非递归
function fib(num) {
var n1=1,n2=1,n=1;
for (var i = 3; i <= num; i++) {
n=n1+n2;
n1=n2;
n2=n;
}
return n;
}

动态规划

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
//动态规划:将大问题转化成小问题
//最少硬币找零问题:找到n所需的最小硬币数
function dpMinCoinChange(coins) {
var coins=coins;
var cache={};
this.makeChange=function (amount) {
var me=this;
if (!amount) {//判断为正
return [];
}
if (cache[amount]) {//判断是否有缓存
return cache[amount];
}
var min=[],newMin,newAmount;
for (var i = 0; i < coins.length; i++) {//对每个面额计算
var coin=coins[i];
newAmount=amount-coin;
if (newAmount>=0) {
newMin=me.makeChange(newAmount);
}
if (newAmount>=0 && (newMin.length<min.length-1 || !min.length)
&& (newMin.length || !newAmount)) {
//判断newAmount是否有效,最小硬币数是否最优,newMin和newAmount是否合理
min=[coin].concat(newMin);
console.log('new Min '+min+ ' for '+amount);
}
}
return (cache[amount]=min);
}
}

贪心策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//贪心算法:近似求解,通过局部最优达到全局最优
//最少硬币找零问题:找到n所需的最小硬币数
function txMinCoinChange(coins){
var coins=coins;
this.makeChange=function(amount){
var change=[],total=0;
for (var i = coins.length; i >= 0; i--) {//对每个面额从大面额开始,从大到小依次
var coin=coins[i];
while (total+coin<=amount) {
change.push(coin);
total+=coin;
}
}
return change;
}
}
]]>
diff --git a/baidu_verify_3NWlza1HUZ.html b/baidu_verify_3NWlza1HUZ.html index d8be5ad0..d0a6abad 100644 --- a/baidu_verify_3NWlza1HUZ.html +++ b/baidu_verify_3NWlza1HUZ.html @@ -466,7 +466,7 @@

- 34 + 35 日志
@@ -643,7 +643,7 @@

- 50.5k + 50.8k --> @@ -660,7 +660,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1292,7 +1292,7 @@

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Docker和K8S容器监控 | Awebone's Blog + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+
+
+ + +
+ + + + + + + + +
+ + + +
+ + + + + + + +
+ + + +

Docker和K8S容器监控

+ + + +
+ + + + + +
+ + + + + +
+

本文记录Docker容器和K8S集群中一些监控命令。

+
+

Docker基本监控

自带常用命令

+
    +
  • docker ps -a:查看进程
  • +
  • docker top 容器id:查看容器资源利用
  • +
  • docker status:实时查看容器资源
  • +
+

图形化工具weavescope

+

部署

+
1
2
3
sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod +x /usr/local/bin/scope
scope launch 本机ip
+ +


+

K8S监控

计算资源分析与监控工具:heapster + dashboard + grafana

部署:下载heapster 包,进入deploy目录,修改相关yaml文件,启动。

+

集群自动伸缩设置

集群cpu或内存达到一定峰值,自动扩容pod

+

1596177920787

+

启用heapster,然后在集群启动时获取cpu利用率等情况,运行以下命令:

+
1
2
3
minikube addons enable heapster
minikube addons list
minikube start --extra-config=controller-manager.HorizontalPodAutoscalerUseRESTClients=false
+

1596179129619

+

然后按照官方文档设置水平扩展,cpu利用率超过50%即扩展,机器最少1台,最多10台

+
1
2
3
4
kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
kubectl get deployment php-apache
kubectl get horizontalpodautoscaler
+


+

log采集和展示:ELK+Fluentd

部署

+
1
2
3
4
kubectl get node
kubectl label node --all beta.kubernetes.io/fluentd-ds-ready=true
kubectl create -f logging/
kubectl get svc --namespace=kube-system
+


+

K8S集群监控方案:婆罗米修斯Prometheus

部署

+
1
2
3
4
kubectl get node
kubectl create -f prometheus/
kubectl get svc
kubectl get pod -o wide
+


+ + +
+ + + + +
+ +
+ +
-------------本文结束感谢您的阅读-------------
+ +
+ +
+ + + + + +

本文标题:Docker和K8S容器监控

+

文章作者:Awebone

+

发布时间:2020年07月31日 - 15:07

+

最后更新:2020年08月03日 - 15:08

+

原始链接:https://www.awebone.com/posts/194a5065/ + +

+

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

+
+ + + +
+ + + + +
+
+
+ + +
+ +
+ + + + + +
+ + + +
+ + + +
+ +
+
+ + +
+ + + + + + + + + +
+ + + + + + + + + +
+
+ +
+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/posts/1d6a9c79/index.html b/posts/1d6a9c79/index.html index f8d25dc7..ed39342f 100644 --- a/posts/1d6a9c79/index.html +++ b/posts/1d6a9c79/index.html @@ -741,7 +741,7 @@

- 34 + 35 日志

@@ -934,7 +934,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -951,7 +951,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1583,7 +1583,7 @@

- 34 + 35 日志

@@ -931,7 +931,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -948,7 +948,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1580,7 +1580,7 @@

if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/4370e84d/index.html b/posts/4370e84d/index.html index 2d06b5ab..e322504d 100644 --- a/posts/4370e84d/index.html +++ b/posts/4370e84d/index.html @@ -751,7 +751,7 @@

总结 - 34 + 35 日志

@@ -944,7 +944,7 @@

总结Site words total count: - 50.5k + 50.8k --> @@ -961,7 +961,7 @@

总结
- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1593,7 +1593,7 @@

总结if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/440e5582/index.html b/posts/440e5582/index.html index 3bced353..3de45cb4 100644 --- a/posts/440e5582/index.html +++ b/posts/440e5582/index.html @@ -951,7 +951,7 @@

总结 - 34 + 35 日志

@@ -1144,7 +1144,7 @@

总结Site words total count: - 50.5k + 50.8k --> @@ -1161,7 +1161,7 @@

总结
- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1793,7 +1793,7 @@

总结if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/4a17b156/index.html b/posts/4a17b156/index.html index 0a81c228..1eba2515 100644 --- a/posts/4a17b156/index.html +++ b/posts/4a17b156/index.html @@ -683,7 +683,7 @@

- 34 + 35 日志

@@ -876,7 +876,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -893,7 +893,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -964,7 +964,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -981,7 +981,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -959,7 +959,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -976,7 +976,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1103,7 +1103,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -1120,7 +1120,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -978,7 +978,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -995,7 +995,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1076,7 +1076,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -1093,7 +1093,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1058,7 +1058,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -1075,7 +1075,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1707,7 +1707,7 @@

总结 - 34 + 35 日志

@@ -1003,7 +1003,7 @@

总结Site words total count: - 50.5k + 50.8k --> @@ -1020,7 +1020,7 @@

总结
- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1652,7 +1652,7 @@

总结if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/86ceb8f1/index.html b/posts/86ceb8f1/index.html index 1d0e6c9d..9ba03eba 100644 --- a/posts/86ceb8f1/index.html +++ b/posts/86ceb8f1/index.html @@ -741,7 +741,7 @@

- 34 + 35 日志

@@ -934,7 +934,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -951,7 +951,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1583,7 +1583,7 @@

if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/8786024c/index.html b/posts/8786024c/index.html index 8365ce96..9d8c4987 100644 --- a/posts/8786024c/index.html +++ b/posts/8786024c/index.html @@ -718,7 +718,7 @@

总结 - 34 + 35 日志

@@ -911,7 +911,7 @@

总结Site words total count: - 50.5k + 50.8k --> @@ -928,7 +928,7 @@

总结
- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1560,7 +1560,7 @@

总结if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/8c3b0bac/index.html b/posts/8c3b0bac/index.html index b4b94991..b2002de3 100644 --- a/posts/8c3b0bac/index.html +++ b/posts/8c3b0bac/index.html @@ -861,7 +861,7 @@

读取 - 34 + 35 日志

@@ -1054,7 +1054,7 @@

读取Site words total count: - 50.5k + 50.8k --> @@ -1071,7 +1071,7 @@

读取
- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1703,7 +1703,7 @@

读取if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/948e1c93/index.html b/posts/948e1c93/index.html index 46379ae2..8663b3d5 100644 --- a/posts/948e1c93/index.html +++ b/posts/948e1c93/index.html @@ -712,7 +712,7 @@

- 34 + 35 日志

@@ -905,7 +905,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -922,7 +922,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1554,7 +1554,7 @@

总结 - 34 + 35 日志

@@ -938,7 +938,7 @@

总结Site words total count: - 50.5k + 50.8k --> @@ -955,7 +955,7 @@

总结
- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1587,7 +1587,7 @@

总结if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/a79c8cf7/index.html b/posts/a79c8cf7/index.html index f0a8f6db..59cbca01 100644 --- a/posts/a79c8cf7/index.html +++ b/posts/a79c8cf7/index.html @@ -819,7 +819,7 @@

- 34 + 35 日志

@@ -1012,7 +1012,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -1029,7 +1029,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -896,7 +896,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -913,7 +913,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1078,7 +1078,7 @@

总结Site words total count: - 50.5k + 50.8k --> @@ -1095,7 +1095,7 @@

总结
- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1727,7 +1727,7 @@

总结if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/c0d60af6/index.html b/posts/c0d60af6/index.html index 0901d1a1..365334d4 100644 --- a/posts/c0d60af6/index.html +++ b/posts/c0d60af6/index.html @@ -140,7 +140,7 @@ - + - 34 + 35 日志

@@ -913,7 +913,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -930,7 +930,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -963,7 +963,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -980,7 +980,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -943,7 +943,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -960,7 +960,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -959,7 +959,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -976,7 +976,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1608,7 +1608,7 @@

落子 - 34 + 35 日志

@@ -938,7 +938,7 @@

落子Site words total count: - 50.5k + 50.8k --> @@ -955,7 +955,7 @@

落子
- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1587,7 +1587,7 @@

落子if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/db1de468/index.html b/posts/db1de468/index.html index 9895fbcf..5e323f32 100644 --- a/posts/db1de468/index.html +++ b/posts/db1de468/index.html @@ -715,6 +715,10 @@

+ +

@@ -796,7 +800,7 @@

- 34 + 35 日志 @@ -989,7 +993,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -1006,7 +1010,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -993,7 +993,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -1010,7 +1010,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1154,7 +1154,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -1171,7 +1171,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1803,7 +1803,7 @@

应用 - 34 + 35 日志

@@ -1019,7 +1019,7 @@

应用Site words total count: - 50.5k + 50.8k --> @@ -1036,7 +1036,7 @@

应用
- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1668,7 +1668,7 @@

应用if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/e913391a/index.html b/posts/e913391a/index.html index 8916cf6a..91d6e7a3 100644 --- a/posts/e913391a/index.html +++ b/posts/e913391a/index.html @@ -762,7 +762,7 @@

总结 - 34 + 35 日志

@@ -955,7 +955,7 @@

总结Site words total count: - 50.5k + 50.8k --> @@ -972,7 +972,7 @@

总结
- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1604,7 +1604,7 @@

总结if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js?t=1595077393092') + navigator.serviceWorker.register('/sw.js?t=1596438922721') .then(function () {console.log('ServiceWorker Register Successfully.')}) .catch(function (e) {console.error(e)}); } diff --git a/posts/fd5cbc55/index.html b/posts/fd5cbc55/index.html index 1d122894..bc867f4c 100644 --- a/posts/fd5cbc55/index.html +++ b/posts/fd5cbc55/index.html @@ -740,7 +740,7 @@

- 34 + 35 日志

@@ -933,7 +933,7 @@

Site words total count: - 50.5k + 50.8k --> @@ -950,7 +950,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1582,7 +1582,7 @@

+ + Docker和K8S容器监控 + /posts/194a5065/ +
+

本文记录Docker容器和K8S集群中一些监控命令。

+
+

Docker基本监控

自带常用命令

+
    +
  • docker ps -a:查看进程
  • +
  • docker top 容器id:查看容器资源利用
  • +
  • docker status:实时查看容器资源
  • +
+

图形化工具weavescope

+

部署

+
sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod +x /usr/local/bin/scope
scope launch 本机ip
+ +


+

K8S监控

计算资源分析与监控工具:heapster + dashboard + grafana

部署:下载heapster 包,进入deploy目录,修改相关yaml文件,启动。

+

集群自动伸缩设置

集群cpu或内存达到一定峰值,自动扩容pod

+

1596177920787

+

启用heapster,然后在集群启动时获取cpu利用率等情况,运行以下命令:

+
minikube addons enable heapster
minikube addons list
minikube start --extra-config=controller-manager.HorizontalPodAutoscalerUseRESTClients=false
+

1596179129619

+

然后按照官方文档设置水平扩展,cpu利用率超过50%即扩展,机器最少1台,最多10台

+
kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
kubectl get deployment php-apache
kubectl get horizontalpodautoscaler
+


+

log采集和展示:ELK+Fluentd

部署

+
kubectl get node
kubectl label node --all beta.kubernetes.io/fluentd-ds-ready=true
kubectl create -f logging/
kubectl get svc --namespace=kube-system
+


+

K8S集群监控方案:婆罗米修斯Prometheus

部署

+
kubectl get node
kubectl create -f prometheus/
kubectl get svc
kubectl get pod -o wide
+


+]]> + + Linux + + + Docker + + 数据结构与算法JavaScript版(二) /posts/db1de468/ diff --git a/sitemap.xml b/sitemap.xml index e55556ef..4878af81 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,10 +1,17 @@ + + https://www.awebone.com/posts/194a5065/ + + 2020-08-03T07:14:55.011Z + + + https://www.awebone.com/posts/c0d60af6/ - 2020-07-18T13:03:00.335Z + 2020-07-18T13:03:14.242Z diff --git a/sw-register.js b/sw-register.js index e58111a9..94e00439 100644 --- a/sw-register.js +++ b/sw-register.js @@ -1 +1 @@ -navigator.serviceWorker&&navigator.serviceWorker.register('/sw.js?v=20200718210310').then(function(){navigator.serviceWorker.addEventListener('message',function(a){if('sw.update'===a.data){let a=document.querySelector('meta[name=theme-color]'),b=document.createElement('div');a&&(a.content='#000'),b.innerHTML='
\u70B9\u51FB\u5237\u65B0
',document.body.appendChild(b),setTimeout(function(){document.getElementById('app-refresh').className+=' app-refresh-show'},16)}})}); \ No newline at end of file +navigator.serviceWorker&&navigator.serviceWorker.register('/sw.js?v=20200718210410').then(function(){navigator.serviceWorker.addEventListener('message',function(a){if('sw.update'===a.data){let a=document.querySelector('meta[name=theme-color]'),b=document.createElement('div');a&&(a.content='#000'),b.innerHTML='
\u70B9\u51FB\u5237\u65B0
',document.body.appendChild(b),setTimeout(function(){document.getElementById('app-refresh').className+=' app-refresh-show'},16)}})}); \ No newline at end of file diff --git a/sw.js b/sw.js index d6d2a6c7..56d8e685 100644 --- a/sw.js +++ b/sw.js @@ -24,6 +24,8 @@ var precacheUrls = []; precacheUrls.push('/'); + precacheUrls.push('/posts/194a5065/'); + precacheUrls.push('/posts/db1de468/'); precacheUrls.push('/posts/742c7f0a/'); @@ -32,8 +34,6 @@ var precacheUrls = []; precacheUrls.push('/posts/101d1957/'); - precacheUrls.push('/posts/6eadcfba/'); - toolbox.precache(precacheUrls); toolbox.options = {"networkTimeoutSeconds":5}; diff --git a/tags/Docker/index.html b/tags/Docker/index.html index 6be60ddb..16a3be35 100644 --- a/tags/Docker/index.html +++ b/tags/Docker/index.html @@ -378,6 +378,41 @@

2020

+ + + + + + + + + + + + +
@@ -638,7 +673,7 @@

- 50.5k + 50.8k --> @@ -655,7 +690,7 @@

- 博客全站共50.5k字 |  + 博客全站共50.8k字 | 
@@ -1305,7 +1340,7 @@

本文记录Docker容器和K8S集群中一些监控命令。

Docker基本监控

自带常用命令

  • docker ps -a:查看进程
  • docker top 容器id:查看容器资源利用
  • docker status:实时查看容器资源

图形化工具weavescope

部署

1
2
3
sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod +x /usr/local/bin/scope
scope launch 本机ip


K8S监控

计算资源分析与监控工具:heapster + dashboard + grafana

部署:下载heapster 包,进入deploy目录,修改相关yaml文件,启动。

集群自动伸缩设置

集群cpu或内存达到一定峰值,自动扩容pod

1596177920787

启用heapster,然后在集群启动时获取cpu利用率等情况,运行以下命令:

1
2
3
minikube addons enable heapster
minikube addons list
minikube start --extra-config=controller-manager.HorizontalPodAutoscalerUseRESTClients=false

1596179129619

然后按照官方文档设置水平扩展,cpu利用率超过50%即扩展,机器最少1台,最多10台

1
2
3
4
kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
kubectl get deployment php-apache
kubectl get horizontalpodautoscaler


log采集和展示:ELK+Fluentd

部署

1
2
3
4
kubectl get node
kubectl label node --all beta.kubernetes.io/fluentd-ds-ready=true
kubectl create -f logging/
kubectl get svc --namespace=kube-system


K8S集群监控方案:婆罗米修斯Prometheus

部署

1
2
3
4
kubectl get node
kubectl create -f prometheus/
kubectl get svc
kubectl get pod -o wide


]]> +

本文记录Docker容器和K8S集群中一些监控命令。

Docker基本监控

自带常用命令

  • docker ps -a:查看进程
  • docker top 容器id:查看容器资源利用
  • docker status:实时查看容器资源

图形化工具weavescope

部署

1
2
3
sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod +x /usr/local/bin/scope
scope launch 本机ip


K8S监控

计算资源分析与监控工具:heapster + dashboard + grafana

部署:下载heapster 包,进入deploy目录,修改相关yaml文件,启动。

集群自动伸缩设置

集群cpu或内存达到一定峰值,自动扩容pod

1596177920787

启用heapster,然后在集群启动时获取cpu利用率等情况,运行以下命令:

1
2
3
minikube addons enable heapster
minikube addons list
minikube start --extra-config=controller-manager.HorizontalPodAutoscalerUseRESTClients=false

1596179129619

然后按照官方文档设置水平扩展,cpu利用率超过50%即扩展,机器最少1台,最多10台

1
2
3
4
kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
kubectl get deployment php-apache
kubectl get horizontalpodautoscaler


log采集和展示:ELK+Fluentd

部署

1
2
3
4
kubectl get node
kubectl label node --all beta.kubernetes.io/fluentd-ds-ready=true
kubectl create -f logging/
kubectl get svc --namespace=kube-system


K8S集群监控方案:婆罗米修斯Prometheus

部署

1
2
3
4
kubectl get node
kubectl create -f prometheus/
kubectl get svc
kubectl get pod -o wide


]]>
diff --git a/baidu_verify_3NWlza1HUZ.html b/baidu_verify_3NWlza1HUZ.html index d0a6abad..d961528a 100644 --- a/baidu_verify_3NWlza1HUZ.html +++ b/baidu_verify_3NWlza1HUZ.html @@ -1292,7 +1292,7 @@