1.概要
いわゆるアルゴリズム、即ち計算をするときに使用される方法の特定の操作が行われると、アルゴリズムは、コンピュータ、コンピュータにおける設定動作予め算出コンピュータを指します。
二つの主要な指標2.アルゴリズム
2.1実行時間
2.2メモリ消費量
3.予選
排他的論理和演算子^ 3.1
3.1特長
排他的OR演算の特性の異なるデータA XOR Bデータの結果である二つのデータAであります
例えば:
System.out.println(3 ^ 4 ^ 4);
4.古典アルゴリズムの問題
4.1質問1
タイトル:従来の0-99、100の整数の合計、アレイにこれらの100件のデータを変更し、次に整数値(固有値反復)配列に0~99として追加このランダム配置データ101、およびその複製番号を見つけるために。
public static void test01(){
// 1. 定义数组
int[] arr = new int[101];
for(int index = 0 ; index < arr.length ; index ++){
arr[index] = index;
}
// 随机添加一个重复的数据
arr[100] = new Random().nextInt(99) + 1;
printArray(arr);
System.out.println();
System.out.println("---------------------------------------------");
// 2. 将数组随机排列
/*
异或方式做交换效率较低
Long start = System.nanoTime();
for(int i = 0 ; i < 1000 ; i++){
int index1 = new Random().nextInt(101);
int index2 = new Random().nextInt(100) + 1;
arr[index1] = arr[index1] ^ arr[index2];
arr[index2] = arr[index1] ^ arr[index1];
arr[index1] = arr[index1] ^ arr[index2];
}
Long end = System.nanoTime();
System.out.println((end - start)); // 3568313
*/
Long start1 = System.nanoTime();
for(int i = 0 ; i < 1000 ; i++){
int index1 = new Random().nextInt(101);
int index2 = new Random().nextInt(101);
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
Long end1 = System.nanoTime();
System.out.println((end1 - start1)); // 629969
printArray(arr);
System.out.println();
// 3. 找出重复的数字
// 方式一:循环遍历
// 缺点:思路简单,时间消耗较大
loop:for(int i = 0 ; i < arr.length; i++){
for(int j = i + 1 ; j < arr.length ; j++){
if(arr[i] == arr[j]){
System.out.println("重复元素是:" + arr[i]);
break loop;
}
}
}
// 方式二:累加求差
// 思路:因为数组中的数值为101个整数,且随机之前,前100个为不重复的数据,所以两者求和之差即为重复的数据
// 缺点:有数据溢出的风险
int sum = 0 ;
for(int i = 0 ; i < arr.length ; i ++){
sum += arr[i];
}
for(int i = 0 ; i < 100 ; i ++){
sum -= i;
}
System.out.println("重复元素是:" + sum);
// 方式三:利用异或的特性
// 思路:拿数组的0号元素和后面的所有元素进行异或,然后用异或的结果再和0-99的数据做异或,最终保留的结果就是重复的元素
for(int i = 1 ; i < arr.length ; i++){
arr[0] = arr[0] ^ arr[i];
}
for(int i = 0 ; i < 100 ; i ++){
arr[0] = arr[0] ^ i;
}
System.out.println("重复元素是:" + arr[0]);
}
/**
* 打印数组
*/
private static void printArray(int[] arr) {
int count = 0;
// 遍历数组
for(int i = 0 ; i < arr.length ; i ++){
if(++count%10 == 0){
System.out.println(arr[i] + "\t");
continue;
}
System.out.print(arr[i] + "\t");
}
}
4.2トピック2
タイトル:従来の0-99、100の整数の合計は、番号0-99のいずれかが別の番号(固有番号リピート)に置き換えたランダムに配置されたアレイ100に、これらの整数を変化させます
質問:これは見つけるために数字を繰り返すことになります
public static void test02(){
int[] arr = new int[100];
for(int i = 0 ; i < arr.length ; i++){
arr[i] = i;
}
// 设置重复数据
int i = new Random().nextInt(100);
int j = new Random().nextInt(100);
while( i == j){
i = new Random().nextInt(100);
j = new Random().nextInt(100);
}
arr[i] = arr[j];
System.out.println("重复的元素是:" + arr[i]);
// 方式一:循环遍历
loop:for(int index = 0 ; index < arr.length ; index ++){
for(int inner = index + 1 ; inner < arr.length ; inner ++){
if(arr[index] == arr[inner]){
System.out.println("重复元素是:" + arr[index]);
break loop;
}
}
}
// 方式二:新建一个数组来实现,用空间换时间
// 思路:新建一个数组,让其长度等于旧的数组,并让其值都等于0,然后,拿旧数组中的值作为新数组的索引,并将该索引处的值加1
int[] newArr = new int[arr.length];
for(int index = 0 ; index < arr.length ; index ++){
newArr[arr[index]] ++;
if(newArr[arr[index]] == 2){
System.out.println("重复元素是:" + arr[index]);
break;
}
}
}
4.3タイトル3
トピック:int型交換の二つの変数
public static void test03(){
int a = 10;
int b = 20;
// 方式一:临时变量法
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a + " b = " + b);
// 方式二:异或方法(时间换空间)
a = a ^ b; // a = a ^ b
b = a ^ b; // b = a ^ b = a ^ b ^ b = a
a = a ^ b; // a = a ^ b = a ^ b ^ a
System.out.println("a = " + a + " b = " + b);
// 方式三:加减法
a = a + b;
b = a - b;
a = a - b;
System.out.println("a = " + a + " b = " + b);
}
注:これは別の方法や、より多くの時間を消費するが、メモリの消費量が比較的小さいです。
4.4ペイフィボナッチ数シーケンス
そのようなAシリーズを指し、いわゆるフィボナッチ・シーケンス番号のPEI波:1,1,2,3,5,8,13,21,34、。。。。。。
データの列30の値の数を求めます。
法律:
第三の要素から、データ及び第2データの各
第一及び第二値データが1であります
4.4.1再帰アルゴリズム
public static void test04(){
System.out.println(getNum(30));
}
// location表示第几个元素
private static int getNum(int location){
if(location == 1 || location == 2){
return 1;
}
return getNum(location -1 ) + getNum(location - 2);
}
注:あまりにも多くの時間がメソッドを呼び出すための再帰的アルゴリズムは、しかし、効率が低すぎる、実装することができ、表示されるように繰り返し呼び出しの多くの例があるだろう
4.4.2覚書アルゴリズム
再帰アルゴリズムを使用して、コールの同じパラメータの多くがあるでしょう、それは真剣に、我々はキャッシュを使用できるため、パフォーマンスに影響を与えるだろう、同じパラメータは、一時記憶覚書アルゴリズムと呼ばれているこのようにキャッシュハッシュマップになります。
public static void test05(){
System.out.println(getNumByHash(30));
}
private static HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
private static int getNumByHash(int location){
if(location == 1 || location == 2){
return 1;
}
if(hm.containsKey(location)){
return hm.get(location);
}else {
int value = getNumByHash(location - 1) + getNumByHash(location - 2);
hm.put(location, value);
return value;
}
}
4.4.3動的プログラミングアルゴリズム
分析を通じて、我々は第三の要素の先頭から、データの各データと最初の二つであることを知っている、と私たちは、このデータを取り、その前に、彼らは新しいデータを取得することができます。
public static void test06(){
System.out.println(getNum5(30));
}
public static int getNum5(int location){
if(location == 1 || location == 2){
return 1;
}
int a = 1;
int b = 1;
int temp = 0 ;
for(int i = 3 ; i <= location ; i++){
temp = a + b;
a = b;
b = temp;
}
return temp;
}