`
madbluesky
  • 浏览: 82988 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

答复: 一道算法题,百思不得其解,求指导[非降序列找目标项,二分法变体]

    博客分类:
  • java
 
阅读更多
正确解看此链接
http://www.cnblogs.com/sunyongyue/archive/2010/12/04/1896675.html
这个条件粗看起来不是很靠谱,事实上却很好用

代码实现如下,
import java.util.Arrays;

public class AiEqualsISearcher {
	private static int ARR_LENGTH = 100;
	private int[] numArr = new int[ARR_LENGTH];
	private int stepCount = 0;

	private void init() {
		int targetElement = (int) (Math.random() * (ARR_LENGTH - 1));
		numArr[targetElement] = targetElement;
		int num = targetElement - 1;
		while (num >= 0) {
			int tmp = (int) (Math.random() * 3);
			numArr[num] = numArr[num + 1] - tmp;
			if (numArr[num] == num) {
				numArr[num] = num - 1;
			}
			num--;
		}
		for (int i = targetElement + 1; i < ARR_LENGTH; i++) {
			int tmp = (int) (Math.random() * 5);
			numArr[i] = numArr[i - 1] + tmp;
			if (numArr[i] == i) {
				numArr[i] = i + 1;
			}
		}
		System.out.println("the num arr init as " + Arrays.toString(numArr));
		System.out.println("the target index is " + targetElement);
	}

	private int search(int start, int end) {
		System.out.println("check a[" + start + "," + end + "]");
		stepCount++;
		int middle = (start + end) / 2;
		if (numArr[middle] == middle) {
			return middle;
		}
		if (start >= end) {
			return -1;
		}
		if (end >= numArr[middle]) { // && numArr[end] >= middle
			int result = search(middle + 1, end);
			if (result != -1) {
				return result;
			} else {
				return search(start, middle - 1);
			}
		} else {
			System.out
					.println("a[" + middle + "," + end + "] no need to check");
			return search(start, middle - 1);
		}
	}

	public static void main(String[] args) {
		AiEqualsISearcher searchAi = new AiEqualsISearcher();
		searchAi.init();
		System.out.println("\nstart to search...");
		int i = searchAi.search(0, AiEqualsISearcher.ARR_LENGTH - 1);
		if (i >= 0) {
			System.out.println("find a[" + i + "]=" + i + " with "
					+ searchAi.stepCount + " steps ");
		} else {
			System.out.println("can't find the element");
		}
	}
}


分享到:
评论

相关推荐

    生物信息学算法与实践(同济大学内部资料)

    - **目标**:深入学习遗传算法、分子对接及隐马尔可夫模型(HMM)等高级算法,并探讨其在生物信息学领域的具体应用。 - **主要内容**: - 遗传算法的不同变体及其在生物和化学领域的应用案例。 - 分子对接技术,包括...

    北京大学数据结构教程算法分析

    ### 数据结构教程之算法分析——排序算法详解 #### 一、引言 在《北京大学数据结构教程算法分析》这本书中,作者们详细介绍了多种排序算法,并深入探讨了它们的实现原理、性能分析以及应用场景。排序是计算机科学中...

    排序算法集总

    在IT领域,排序算法是数据结构与算法中的基础且重要的一部分。它们被广泛应用于各种软件开发,例如数据库管理系统、搜索引擎优化、数据分析等。下面将详细解释标题和描述中提到的几种排序算法,以及它们的工作原理和...

    贪心算法_小北1

    贪心算法是解决问题的一种策略,它在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的。例如在P1016题中,旅行家的预算问题就是通过贪心策略来解决的,总是选择...

    数据结构学习方法(严蔚敏版)

    - **基数排序**:非比较排序算法之一。 #### 总结 严蔚敏版的数据结构学习方法为学生提供了全面而深入的学习资源。通过系统地学习这些知识点,不仅可以掌握数据结构的基本理论,还能学会如何在实际问题中应用它们...

    数据结构里的排序问题

    排序算法是用于重新组织数据序列,使其按照特定标准(如升序或降序)排列的算法。这里我们将深入探讨标题和描述中提及的一些主要排序算法:交换排序、选择排序、桶排序、归并排序、快速排序以及二分法排序。 1. **...

    大数计算器大数计算器,采用迭代等算法我用它计算了上亿位的PI值

    通过对数组乘法算法的优化、利用傅立叶变换及其变体、扩展基本运算功能以及对内存使用的优化,使得大数计算器能够在处理极为庞大的数值时依然保持高效稳定。此外,通过严谨的异常处理机制,确保了计算结果的准确性。...

    meuhod_optimization.rar_campe4m_系统/网络安全

    综上所述,这个压缩包包含了一系列用于解决单变量优化问题的算法,如线性搜索、三次插值、动态区间搜索、斐波那契搜索、二次插值、黄金分割搜索、二分法以及Himmelman算法的变体。这些算法在寻找函数的最小值或最大...

    CS实验参考题目(包括背包问题)

    在这个压缩包中,"CS实验参考题目(包括背包问题)" 提供了五个实验课题,涉及了二分法和背包问题这两个重要的算法主题。下面将详细阐述这两个领域的知识。 **一、二分法** 二分法,又称折半查找,是一种在有序...

    763269.rar_763269_分段插值_分段线性插值

    接着,"二分法"是一种查找算法,常用于求解方程根或者在有序序列中查找特定值。它将问题区间不断减半,每次检查中间值,根据比较结果排除掉一半的可能范围,直到找到目标值或者确定不存在目标值为止。这种方法在处理...

    Numerik-Analiz-Algoritmalari-开源

    《数值分析算法开源实现》 在信息技术领域,数值分析算法是解决复杂数学问题的重要工具,它们在物理、工程、金融等多个领域都有广泛应用。本项目"Numerik-Analiz-Algoritmalari-开源"是一个开放源代码的实现,旨在...

    C++高级编程实践

    - 介绍了一种算法问题,即如何找到数组中具有最大和的连续子序列。 **2.7 断言** - 断言是一种编程工具,用于在开发过程中检查假设是否成立。这里会介绍assert宏的用法及其在调试中的应用。 **2.8 O表示法** - ...

Global site tag (gtag.js) - Google Analytics