当前位置: 首页 > wzjs >正文

浦项建设中国有限公司网站班级优化大师免费下载电脑版

浦项建设中国有限公司网站,班级优化大师免费下载电脑版,新冠疫情最新数据,福州做网站的公司有哪些分治算法(Divide and Conquer)是一种解决复杂问题的非常实用的策略,广泛应用于计算机科学中的各个领域。它的核心思想是将一个复杂的问题分解成若干个相同或相似的子问题,递归地解决这些子问题,然后将子问题的解合并&a…

_20250223230836.jpg

分治算法(Divide and Conquer)是一种解决复杂问题的非常实用的策略,广泛应用于计算机科学中的各个领域。它的核心思想是将一个复杂的问题分解成若干个相同或相似的子问题,递归地解决这些子问题,然后将子问题的解合并,最终得到原问题的解。分治算法的典型应用包括归并排序、快速排序、二分查找等。

本文将详细介绍分治算法的基本思想以及如何在Java中实现分治算法。

基本思想

分治算法的基本思想可以概括为以下三个步骤:

  • 分解(Divide):将原问题分解成若干个规模较小的子问题,这些子问题与原问题相似,但规模更小。

  • 解决(Conquer):递归地解决这些子问题。如果子问题的规模足够小,则直接求解。

  • 合并(Combine):将子问题的解合并成原问题的解。

分治算法的关键在于如何将问题分解成子问题,以及如何将子问题的解合并。

适用场景

分治算法所能解决的问题一般具有以下几个特征:

  • 问题可分解:
    问题能够分解为多个相似的子问题,且子问题相互独立。

  • 子问题可解:
    分解后的子问题可以直接求解。

  • 子问题解可合并:
    子问题的解能够合并为原问题的解。

  • 效率提升:
    分解和合并的复杂度低于直接求解原问题。

典型应用场景

  • 排序算法:如归并排序、快速排序、求解逆序对。

  • 查找算法:如二分查找。

  • 数学计算:如大整数乘法、矩阵乘法(Strassen算法)。

  • 几何问题:如最近点对问题。

  • 图算法:如快速傅里叶变换(FFT)。

归并排序介绍及Java实现

我们本文中以归并排序来介绍及示例分治算法。

归并排序是一种分治策略的排序算法,它的核心思想是将数组分成两个子数组,递归地对子数组进行排序,然后将排序好的子数组合并起来,最终得到有序的数组。如下图所示:

_20250223220512.jpg

java 代码实现归并排序:

/*** 归并排序**/
public class MergeSort {// 归并排序的入口方法public static void mergeSort(int[] arr) {int[] temp = new int[arr.length];sort(arr, 0, arr.length - 1,temp);}// 归并排序的核心排序方法(递归调用的方法)public static void sort(int[] arr, int left, int right,int[] temp) {// 递归终止条件,直至单个元素if (left < right) {int mid = (left + right) / 2;//左边部分递归sort(arr, left, mid, temp);//右边部分递归sort(arr, mid + 1, right, temp);//归并merge(arr,left,mid,right, temp);}}//归并排序的核心归并方法public static void merge(int[] arr, int left, int mid, int right,int[] temp) {int i = left;int j = mid + 1;int k = left;// 比较左右两部分的元素,并将较小的元素放入临时数组([left,right]区间元素排序)while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}//如果右边元素先放完,则将左边剩余的元素逐个放入临时数组中while (i <= mid) {temp[k++] = arr[i++];}//如果左边元素先放完,则将右边剩余的元素逐个放入临时数组中while (j <= right) {temp[k++] = arr[j++];}// 将临时数组的结果复制回原数组for (int l = left; l <= right; l++) {arr[l] = temp[l];}}public static void main(String[] args) {int[] arr = new int[]{7,5,2,3,6,4};System.out.println("原始数组:"+ Arrays.toString(arr));mergeSort(arr);System.out.println("排序后的数组:"+ Arrays.toString(arr));}
}

数组中的逆序对

  • 题目描述:

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007

数据范围: 对于50%的数据,size <= 1 0 4 10^4 104

对于100%的数据,size <= 1 0 5 10^5 105

数组中所有数字的值满足 0<= val <= 1 0 9 10^9 109

要求:空间复杂度 O(n) ,时间复杂度 O( l o g log log n)

输入描述:
题目保证输入的数组中没有的相同的数字

  • 示例

示例1

输入:[1,2,3,4,5,6,7,0]
返回值:7

示例2

输入:[1,2,3]
返回值:0
  • 代码
public class InversePairs {//初始化逆序对的个数public static int ret = 0;// 归并排序的入口方法public static int mergeSort(int[] arr) {int[] temp = new int[arr.length];sort(arr, 0, arr.length - 1,temp);return  ret;}// 归并排序的核心排序方法(递归调用的方法)public static void sort(int[] arr, int left, int right,int[] temp) {// 递归终止条件,直至单个元素if (left < right) {int mid = (left + right) / 2;//左边部分递归sort(arr, left, mid, temp);//右边部分递归sort(arr, mid + 1, right, temp);//归并merge(arr,left,mid,right, temp);}}//归并排序的核心归并方法public static void merge(int[] arr, int left, int mid, int right,int[] temp) {int i = left;int j = mid + 1;int k = left;// 比较左右两部分的元素,并将较小的元素放入临时数组([left,right]区间元素排序)while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];// 奥妙之处,右边元素左移为逆序对,区间合并的时候每个区间都是有序的ret += (mid - i + 1);ret %= 1000000007;}}//如果右边元素先放完,则将左边剩余的元素逐个放入临时数组中while (i <= mid) {temp[k++] = arr[i++];}//如果左边元素先放完,则将右边剩余的元素逐个放入临时数组中while (j <= right) {temp[k++] = arr[j++];}// 将临时数组的结果复制回原数组for (int l = left; l <= right; l++) {arr[l] = temp[l];}}public static void main(String[] args) {int[] arr = new int[]{1,2,3,4,5,6,7,0};System.out.println("原始数组:"+ Arrays.toString(arr));int ret = mergeSort(arr);System.out.println("排序后的数组:"+ Arrays.toString(arr));System.out.println("统计的逆序对的个数:"+ ret);}}

总结

分治算法是一种非常强大的算法设计思想,能够有效地解决许多复杂的问题。通过将问题分解成更小的子问题,递归地解决这些子问题,然后将子问题的解合并,我们可以高效地解决许多实际问题。本文通过归并排序和逆序对两个经典例子,展示了分治算法的基本思想和Java实现。

http://www.dtcms.com/wzjs/320998.html

相关文章:

  • 做100个网站保定seo推广
  • 郑大动态网站建设简答题百度seo网站
  • 新疆建设兵团发改委网站b站视频推广网站400
  • 郑州房地产网站哪有恶意点击软件买的
  • 百度竞价推广托管seo整站优化外包
  • 杭州网站建设开发外包公司网站链接提交
  • 烟台高端网站建设公司域名历史查询工具
  • 做网站 前端雅诗兰黛网络营销策划书
  • 武汉网站建设排行百度关键词排名爬虫
  • 政府网站建设费用增加百度图片识别搜索引擎
  • wordpress 特殊符号杭州上城区抖音seo有多好
  • wap网站e4a做app广告投放怎么做
  • 网站内容页显示不出来郑州网站技术顾问
  • 网站开发好不好月入百万的游戏代理
  • 上海平台网站开发网站开发流程
  • 学做网站论坛软文写作范文
  • 天津市建设工程合同备案网站怎样做推广
  • 360 的网站链接怎么做网站建设的基本
  • 做网站用什么数据库seo网站推广下载
  • 专门做包装的网站云搜索app下载
  • 品牌网站建设价格实惠优化网站推广教程排名
  • 手机做网站杭州网站seo公司
  • 个人网站首页设计欣赏成都网站优化排名
  • wordpress文件上传管理seo关键词怎么优化
  • 有了网站源码 怎么建设网站自动连点器
  • 沈阳正规制作网站公司百度联盟推广
  • 网站建设新闻发布注意深圳seo公司
  • 搜狗收录网站google 官网入口
  • 网站建设费可以抵扣么电脑突然多了windows优化大师
  • 网页界面设计怎么做seo搜索