day_07 简单的算法

复习

二分查找法

核心思想:分治思想
前提:数组必须是有序的,经过排序之后的数组
实现思想:通过使用中间元素和目标元素比较	来进行范围的缩小。
public class BineraySearch {
    public static void main(String[] args) {
        int[] arr = {21, 35, 12, 20, 65, 5, 56};
        for (int j = 0; j < arr.length - 1; j++) {
            int min = j; // min来记录当前最小的元素所在的位置
            for (int i = j; i < arr.length; i++) {
                if (arr[i] < arr[min]) {
                    min = i;
                }
            }
            // 比较结束之后  min记录的就是当前最小的
            // 元素所在的位置  将最小的元素和当前元素进行位置 的交换
            int temp = arr[j];
            arr[j] = arr[min];
            arr[min] = temp;

        }

        // 遍历数组
        for (int x : arr) {
            System.out.println(x);
        }
        boolean b = search(arr, 65);
        System.out.println("查找目标元素的结果:" + b);
    }
    /**
     * 实现二分搜索法 查找目标元素
     * @param arr 查找的数组
     * @param key 查找的目标元素
     * @return  boolean 找到目标元素 返回true  如果没有找到 则返回false
     */
    public  static  boolean  search(int[] arr , int key){
        int start = 0;
        int end = arr.length - 1;
        // 查找目标元素 结束的 条件是: 找到目标元素 或者 整个数组查找结束
        // 在循环执行过程中,start  不能大于end
        while(start <=  end){
            // 确定中间 元素的位置
            int mid = (start + end)/2;
            if(key == arr[mid]){
                return  true;
            }else if(key < arr[mid]){
                end = mid - 1;
            }else{//key > arr[mid]
                start = mid + 1;
            }
        }
        return  false;
    }
}

JDK API文档的使用

Arrays

专门针对数组操作的工具类

二分法查找
在这里插入图片描述

使用:

System.out.println(res);
// 在当前数组的指定范围内查找目标元素
//如果找到 则返回目标元素在完整数组中的 索引
int res1 = Arrays.binarySearch(arr,2,5,5);
System.out.println(res1);

排序算法的使用
在这里插入图片描述

//使用Arrays提供的排序算法对数组进行排序
// Arrays.sort(arr); 
 // 包含开始位置 的 元素 但是不包含结束位置的元素
 Arrays.sort(arr,2,5);

jdk原码的解读

private static int binarySearch0(int[] a, int fromIndex, int toIndex,
                                 int key) {
    int low = fromIndex;
    int high = toIndex - 1;

    while (low <= high) {// 循环比较
        int mid = (low + high) >>> 1;// 计算中间位置  使用了无符号右移 相当于除2
        int midVal = a[mid];

        if (midVal < key)
            low = mid + 1;
        else if (midVal > key)
            high = mid - 1;
        else
            return mid; // 找到则直接返回元素所在的索引
    }
    return -(low + 1);  //没有找到 则返回负数
}

排序算法

将数组转化为String类型

//将数组转换为String
String arrStr =  Arrays.toString(arr);
 System.out.println("----" + arrStr);

作业,尝试解读原码并实现将整形数组转换为字符串输出,形式为[21,35,12,20,65,5,56]

在这里插入图片描述
在这里插入图片描述

Random

在这里插入图片描述
在这里插入图片描述

public static void main(String[] args) {
    Random random = new Random();
    //返回一个伪随机数  bound  返回的是任意的随机整数
    System.out.println(random.nextInt());
    //返回一个伪随机数  bound  返回的是0--100之间的数
    System.out.println(random.nextInt(100));
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//Math的Random的方法
System.out.println((int)(Math.random() * 80 + 20) );=

数组的拷贝
在这里插入图片描述
在这里插入图片描述

public class ArrayCopyTest {
    public static void main(String[] args) {
        int[] arr= {21, 35, 20 ,12, 65, 5, 56};
        int[] dest = new int[3];// 目标数组的长度必须大于等于源数组才可以
        /*
        int[] src,拷贝的 源数组
       	int srcPos,拷贝的源数组的起始位置
       	int[] dest,// 拷贝的目标数组
       	int destPos, //拷贝到目标数组中的放入的 起始位置
       	int length,// 拷贝 的元素的个数
         */
        System.arraycopy(arr,0,dest,0,arr.length);
        for(int x : dest){
            System.out.println(x);

        }
    }
}

二维数组(了解)

二维数组的声明:
int[][] arr = new int[行数][列数]
二维数组的动态初始化
public static void main(String[] args) {
        /*
        * 在生命二维数组的时候,两个维度,一个维度表示行,另一个维度表示列
        * 行列可以相同也可以不同
        * 当我们通过arr.length去获取数组的长度时,其实获取的是数组的行数
        * */

        int [][] arr = new int[5][3];
        System.out.println(arr.length);
        // 给二维数组中的元素赋值
        arr[0][0] = 2;
        arr[1][1] = 9;
        arr[2][2] = 7;
        arr[3][2] = 5;
        for (int i = 0 ; i < arr.length ; i++){
            for (int j = 0 ; j < arr[i].length ; j++){
                System.out.print(arr[i][j] + " ");

            }
            System.out.println();

        }
    }
二维数组的静态初始化
public static void main(String[] args) {

        int[][] arr = {{1,2,3},{3,2,1},{4,5,6},{6,5,4},{1,5,9}};
        for (int i = 0 ; i < arr.length ; i++){
            for (int j = 0 ; j < arr[i].length ; j++){
                System.out.print(arr[i][j] + " ");

            }
            System.out.println();
        }
    }
// 静态初始化另一种写法
int[][] arr = new int[][]{{1,2,3},{3,2,1},{4,5,6},{6,5,4},{1,5,9,100}};
使用二维数组打印杨辉三角

在这里插入图片描述

特点:	第一行	一个元素	  为1
		第二行	两个元素	  都为1
		之后每行	首元素和末尾元素均为1	其余元素 yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j]
public class Yanghui {
    /*
    使用二维数组打印杨辉三角
        特点  第一行 只有一个元素 且为1
              第二行 两个元素  都为1
              之后每行  首元素和 末元素均为1  其余元素等于
         yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j]
     */
    public static void main(String[] args) {
        int yanghui[][] =new int[10][];//声明二维数组的时候 行数必须指定 列数可以在使用列之前来指定
        for(int i = 0 ; i < yanghui.length;i++){
            yanghui[i] = new int[i + 1];	// 指定每行的列数。
			
			// 给列赋值元素
            for(int j = 0 ; j < yanghui[i].length;j++){
                	// 每行首尾元素为1;
					if( j == 0 || i == j){
                    yanghui[i][j] = 1;
                }else{

                    yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
                }
            }
        }
        
        // 二位数组的遍历
        for(int i = 0 ; i < yanghui.length;i++){
            for(int j = 0 ;j < yanghui[i].length; j++){

                System.out.print(yanghui[i][j] +"  ");
            }
            System.out.println();

        }
    }
}

二维数组的内存分配情况:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段MATLAB代码的作用是将时间尺度为15分钟的风电一个月出力数据进行聚类,提取出典型日出力数据,并将典型日数据保存到MAT文件中。 具体实现步骤如下: 1. 首先使用load函数加载一个名为"a.mat"的MAT文件,该文件包含了时间尺度为15分钟的风电一个月出力数据。 2. 将数据进行重塑,将原始数据按照日期进行排列,每个日期的数据作为一行,每个时间点的数据作为一列。具体实现方法是将数据向量按照96个数据点(即24小时*4个数据点)进行分组,然后将每组数据作为一行,将所有日期的数据排列成一个矩阵,如下所示: ``` num_days = numel(data) / 96; % 计算数据中包含的日期数 data_matrix = reshape(data, 96, num_days)'; % 将数据重塑为矩阵 ``` 3. 使用k-means算法对数据进行聚类,将数据分成num_clusters个簇。聚类的结果包括每个数据点所属的簇编号idx,以及每个簇的中心centers,如下所示: ``` num_clusters = 10; % 聚类的簇数 [idx, centers] = kmeans(data_matrix, num_clusters); % 对数据进行聚类 ``` 4. 将聚类中心centers作为典型日出力数据,将其重塑为向量形式,并保存到MAT文件中,如下所示: ``` typical_day_profiles = centers'; % 将聚类中心作为典型日出力数据 typical_day_data = reshape(typical_day_profiles, [], 1); % 将典型日数据重塑为向量形式 save('typical_day_wind_data.mat', 'typical_day_data'); % 将典型日数据保存到MAT文件中 ``` 通过这段代码,我们可以将时间尺度为15分钟的风电一个月出力数据进行聚类,提取出典型日出力数据,并将典型日数据保存到MAT文件中,方便后续的分析和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值