序文
フロントエンドが、現在のデータ構造へのアクセスとアルゴリズムは、多くのビジネスアプリケーションではなく、更なるためには、これらの学習が下がる強化エントリとして見なさ、したがって、識字ここでの問題アルゴリズムのいくつかのレコードに、必要です、レビューを容易にするためにとする進歩とみなすことができます。
アルゴリズムの複雑さ
アルゴリズムの複雑さ
时间复杂度
と空间复杂度
- 時間の複雑さ:アルゴリズムの実行(時間)のために必要な計算量を指し、
- 宇宙複雑さは:必要なアルゴリズムの内部空間を指します。
時間複雑
時間複雑性O(X)で表されます
- 時定数:O(1)、それは関係なく量のデータサイズのアルゴリズムの実行時間を表します
- 線形時間複雑:O(N)、Nはデータの量を表します。[動作の回数アルゴリズムについては、それがすることができる
aN+1
、アルゴリズムの時間複雑度はO(N)と比較され、二つの可能なアルゴリズムは次の項及び定数項を下げるために、この時間を比較することにより、O(N)複雑です] - 時間複雑さの数:O(logN個)、コンピュータので進数システムを使用して、多くの場合の対数の底2
ビットコンピューティング
ビット4つの操作に対して計算(±* /)は、通常、はるかに速く、それが算術演算に有用であるようにされている
ので、ビットを計算する学習前に、メモリ動作のビット演算の整数ビットに直接では、バイナリ知っていると小数間の変換
- 小数を
33
見ることができる32 + 1
(以降、および33は、6ビットであるべきである33
近似値32
、小数は、それが6で、32兆2)33
である100001
限り、2の累乗として、それ以外の場合は1であり、さ0 - そうバイナリ
100001
同様塩基、先導2^5
端である2^0
33を追加することによって得られます、
1。 左移 <<
/*
* 10 --> 二进制 1010
* 1010 --> 左移一位 10100
* 10100 --> 十进制 20
*/
10 << 1
2。 右移>>
/*
* 10 --> 二进制 1010
* 1010 --> 右移一位 101
* 101 --> 十进制 5
*/
10 >> 1
ビット単位の演算
1.ビットAND&
各ビットが1であり、結果は1
/*
* 8--> 二进制 1000
* 7--> 二进制 0111
* 1000 & 0111 -> 0000 -> 0
*/
8&7
2.ビットごとのOR|
一つは、結果は、1である1
/*
* 8--> 二进制 1000
* 7--> 二进制 0111
* 1000 | 0111 -> 1111 -> 15
*/
8|7
4.ビットごとの排他的論理和^
それぞれが異なる場合、結果は1
/*
* 8--> 二进制 1000
* 7--> 二进制 0111
* 8^8 --> 1000 ^ 1000 --> 0000
* 8^7 --> 1000 ^ 0111--->1111
*/
8^7 // -> 15
8^8 // -> 0
アルゴリズムleetCode質問(番号136)
ビット単位XORによって複雑で、時間と空間の複雑さが比較的小さいO(N)を解決するために実装することができます
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
var ans = 0;
for(let num of nums){
ans ^=num; //这里借助相同数的^操作结果为0来实现
}
return ans;
};
singleNumber([4,1,2,1,2]); // 4
/*
* 过程解析:
* 1. num=4, 0^=4-->二进制 100
* 2. num=1, 4^=1-->二进制 100^001-->101
* 3. num=2, 二进制 101^= 010 --》 111
* 4. num=1, 二进制 111^= 001 ---> 110
* 5. num=2, 二进制 110^= 010 ---> 100 -->十进制 4
*/
ソートアルゴリズム
バブルソート、挿入ソート、選択、ソート、マージソート、高速な非(二分法):ソートアルゴリズム共通。。。
- クラシック参考
1.バブルソート
/*
* 思路:冒泡排序每次两两比较,将大的一位排向后边,每一轮都会将最大的排到最后
*/
function bubbleSort(arr){
//因为冒泡排序算法是两两比较 所以外层比较次数应为数组长度-1
for(var i = 0; i<arr.length - 1; i++){
// 内循环的比较不必全部执行完 因为每一轮的内循环都会将最大的数排在最右
// 所以后面的次数不用比较 所以内循环的次数是递减的 需要减去一个i
for(var j = 0; j < arr.length -1 - i; j++){
if(arr[j] > arr[j+1]){
var t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
console.log(arr)
}
return arr;
}
2.挿入ソート
原則:最初の要素は、既定の要素、および削除現在の要素の下の要素の比較をソートされている場合、大きなスワップポジションの現在の要素。この時点で、最初の要素は、第3作動要素、フォワード比較から取り出し、次のように、直前の操作を繰り返し、現在の最小数です。
3. [並び替え
原理:反復は、最小値は、抽出された電流よりも小さいトラバーサルは、最小屈折率と第一スイッチング素子の値完了した後、インデックスの最小値を置き換えた場合、最小インデックスは、0に設定します。以上の動作後、最初の要素は、アレイ内の最小値であり、次のトラバース動作が繰り返される上方インデックス1から開始することができます。
4.クイックソート
原理:左から基準値と右のサイズの比較の範囲の配列における基準値として、ランダムに選択された値、。基準値よりも小さいが、大きなコントラスト基準値と基準値の交換位置よりも第1の値が完了した後、左列、大きな場所を右に置きます。アレイは、基準値の位置は、上記操作再帰的に2つの部分に分割されます。
var arr = [3, 4, 2, 6, 5, 8, 9, 10, 16, 13]; // length = 10
function quickSort(arr) {
if (arr.length <= 1) { return arr; }
// 基准值
var pivot = arr[Math.floor(arr.length / 2)];
arr.splice(arr.indexOf(pivot), 1);
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 quickSort(left).concat([pivot], quickSort(right));
}
console.log(quickSort(arr));