java算法思考--二分法

二分法,二分法,简单来说就是将一个问题拆成二半,分成几个比较小的问题,在数据量以及计算次数比较多时候就能极大限度减少时间复杂度。

现在我们要处理一个这样的问题,比如我们算出某种数据的规律,要将一堆数据的走势算出来,为了不是很枯燥,咱就弄个好玩的例子吧,

例如你获得了个神器的瓶子,你可以每天向它要钱,它可能给你一定数量的钱,也有可能吞掉你一定的钱,现在知道了它给你钱和星期几星期几有关,那么你会怎么办呢?



额,没那么多钱还。。。先不管那么多,作为一个程序猿直接开始搞程序啦!

假如我们知道周一到周日的利润是2,-5,5,-6,7,8,9,-5,-6,1,那么我们该从那一天买入呢?这就是我们要处理的问题?

先说下,假如不用二分法我们该怎么做。我们就可以采用比较暴力的手段,用双重for循环,依次判断以第一天,第二天,第三天....作为起点,先将第一天也就是2存储起来,作为最后赚的钱,然后依次加上后续天数的值,比如加上-5,先判断-5+2与2那个大,明显2大于-5,所以最后得到的值不可能是2+-5,但将下标和值暂存,继续加上第二个,2+-5+5,还是没有2大,加上第三个,还是没有2+(-5)+5+(-6),再加上第四个2+(-5)+5+(-6)+7此时比2大,可以将最终结果替换。

以上看代码:int[] profit={2,-5,5,-6,7,8,9,-5,-6,1};

int price=profit[0];

int endindex,startindex=0;

for(int i=0;i<=10;i++)

{int temppric=0;

startindex=i;

for(int j=i+1;j<=10;j++)

{tempprice+=profit[j];

endindex=j;

if(price<tempprice)

{endindex=j;

price=tempprice;}

}

}

大概这样的思路就能得到最后的结果了。但是这个代码在处理大量数据的时候往往会力不从心,我们就可以这样打算,将中间一拆二半,分别调用dichoto(开始,中间),dichoto(中间,结尾)

然后开始到最后差不多这样方法进行处理,这样就可以在大量数据时提高效率了,废话不说,看代码

package xxxx;

import java.sql.Struct;

public class Dichotomy {

public static void main(String[] args) {
	int[]a={2,-5,5,-6,7,8,9,-5,-6,1};
	FIarray s=dichoto(0, 9, a);
	System.out.println(s.endindex);
	System.out.println(s.startindex);
	System.out.println(s.total);
	
	
}
static FIarray dichoto(int origin,int end,int[] xx)
{if(origin==end)
{FIarray re=new FIarray();
re.startindex=origin;
re.endindex=end;
re.total=xx[origin];
	return re;}
	FIarray re1=dichoto(origin, (end+origin)/2, xx);
	FIarray re2=dichoto((end+origin)/2+1, end, xx);
int money=xx[origin],money2=xx[(end+origin)/2+1];
int finalmoney=0;
int startpoint=(end+origin)/2,endpoint=(end+origin)/2+1;
	for (int i = (end+origin)/2; i >=origin ; i--) {
		finalmoney+=xx[i];
		if (money<finalmoney) {
			money=finalmoney;
			startpoint=i;
			
		}
	}
	finalmoney=0;
	for (int j = (end+origin)/2+1; j <=end; j++) {
		finalmoney+=xx[j];
		if (money2<finalmoney) {
			money2=finalmoney;
			endpoint=j;
			
		}
	}
	FIarray re3=new FIarray();
	re3.startindex=startpoint;
	re3.endindex=endpoint;
	re3.total=money+money2;
	if(re3.total>=re1.total&&re3.total>=re2.total)
	return re3;
	else if(re2.total>=re1.total&&re2.total>=re3.total)
	return re2;
	else 
	return re1;
	}
}
 class FIarray {
	int startindex;
	int endindex;// TODO Auto-generated method stub
	int total;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二分法(二分查找)是一种在有序数组中查找某一特定元素的搜索算法。实现的基本思路是将数组从中间开始分成两部分,判断要查找的元素在哪一部分中,然后继续在该部分中进行查找,直到找到目标元素或者确定目标元素不存在为止。 下面是用 Java 实现二分法算法的示例代码: ```java public class BinarySearch { // 二分法查找指定元素在数组中的位置 public static int binarySearch(int[] arr, int target) { int left = 0; int right = arr.length - 1; while (left <= right) { int mid = (left + right) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; } // 测试二分法算法 public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int target = 5; int result = binarySearch(arr, target); if (result == -1) { System.out.println("元素不在数组中"); } else { System.out.println("元素在数组中的位置为:" + result); } } } ``` 在这个示例代码中,我们定义了一个 `binarySearch` 方法来实现二分法算法。该方法接收两个参数:一个有序数组和一个目标元素。在方法中,我们定义了两个变量 `left` 和 `right` 分别表示数组的左右边界。然后使用一个 while 循环来不断缩小查找范围,直到找到目标元素或者确定目标元素不存在为止。 在循环中,我们首先计算出数组的中间位置 `mid`,然后判断目标元素是在中间位置的左边还是右边。如果目标元素比中间位置的值要大,则说明目标元素在中间位置的右边,需要将左边界向右移动;反之,如果目标元素比中间位置的值要小,则说明目标元素在中间位置的左边,需要将右边界向左移动。当左边界大于右边界时,表示目标元素不存在于数组中,此时返回 -1。 最后,我们在 `main` 方法中调用 `binarySearch` 方法来测试二分法算法。在测试中,我们定义了一个有序数组和一个目标元素,并将它们作为参数传递给 `binarySearch` 方法。如果方法返回的结果为 -1,则表示目标元素不在数组中;否则,方法返回的结果就是目标元素在数组中的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值