0 0

多对一算法问题25

boolean isMatch(double[]array,double target){
} 

match的规则是,先在array里面找,有没有一个元素array[i]==target,如果有则返回true,如果没有,继续找有没有任意两个元素相加==target,即array[i]+array[j]==target;如果还是没有继续找有没有任意三个元素相加==target,以此类推,只到array.length()个相加能不能==target为止,最终如果还是没找到,则返回false.

问题补充:
kidding87 写道
楼主换了个分多的号来了。。。
那个我觉得应该用深度搜索来解吧,你这个直接限定死了

能讲的具体些吗?

问题补充:
kidding87 写道
数组先排序~
例子:[1,2,5,6,7,10,12,15,20,23,24,26,29] 50
循环取1、2。。。、29
开始从深度挖掘取1 ,剩余49 寻找最接近49的数 29剩余 20 ok找到20 然后后退看有没有能代理20的 找15 剩余5 找到5, 在用12 。。。
基本就是过程
1 29 20
1 29 15 5
1 29 12 6 2
1 29 10 就不行了 然后 pop 29
1 26 23
。。。。
思路有点乱,利用堆栈~

好吧,我先试试,看代码能不能写出来

问题补充:
kidding87 写道
数组先排序~
例子:[1,2,5,6,7,10,12,15,20,23,24,26,29] 50
循环取1、2。。。、29
开始从深度挖掘取1 ,剩余49 寻找最接近49的数 29剩余 20 ok找到20 然后后退看有没有能代理20的 找15 剩余5 找到5, 在用12 。。。
基本就是过程
1 29 20
1 29 15 5
1 29 12 6 2
1 29 10 就不行了 然后 pop 29
1 26 23
。。。。
思路有点乱,利用堆栈~

哥,小弟愚钝,代码写不出来,赐教

问题补充:
kidding87 写道
 /**
     * match(深度匹配,参数:数组n[],查询值t,截止位置end,查询记录栈stack,深度deep)
     * MyStack 以LinkedList为基础的stack简单的pop push操作,重写toString 使用list.toString()
    */
    public static void match(int[]n,int t,int end,MyStack stack,int deep){
        for(int i=leftApproachT(n, t,end);i>=0;i--){
          int temp=t-n[i];
          int temp2 =deep;
          stack.push(n[i]);
            if(temp>0) {
                match(n, temp,i,stack,temp2++);
            }
            else if(temp==0){
                System.out.println(stack);
                }
            //将不需要的数据出栈
            for(int j=deep;j>=0;j--)
                stack.pop();
        }
    }
    /**
     * leftApproachT(从左开始查询最接近t的值所在数组n中对应的位置)
    */
    public static int leftApproachT(int[]n,int t,int end){
      for(int i=0;i<end;i++){
          if(n[i]>t) return i-1;
      }
      return end-1;
    }
    


判断出来没什么难度,把结果也都打出来

谢谢!!!能找出来,但是数量稍微多一点的时候,效率一下降低了,而且容易outOfMemory!

问题补充:
kidding87 写道
我刚试过了,oom没有遇到,你看看把MyStack直接用linkedList,查询的结果集确实非常大

int[] n = { 1, 2, 5, 6, 7, 10, 12, 15, 20, 23, 24, 26, 29,30,31,33,40,55,59,66,88
,100,111,123,140,150,180,200,211,222,332,332,400,451,900,1223,2203,2234,5552};
        int t=6000;
效率我觉得还是比较高的,一秒钟差不多10W条数据吧
这个结果集至少超过10G。。。

我试验了用100条数据去跑,跑了几个小时了  也没跑出结果,不过100条数据的组合确实比较多
public static void main(String[] args) {
		long start = System.currentTimeMillis();
		Random ran = new Random();
		int[] a = new int[100];
		for (int i = 0; i < a.length; i++) {
			a[i] = ran.nextInt(1000);
		}
		Arrays.sort(a);
		match(a, 5000, a.length, new LinkedList(), 0);
		System.out.print(count);
		long time = System.currentTimeMillis() - start;
		System.out.println(time/1000);
	}

问题补充:
kidding87 写道
我刚试过了,oom没有遇到,你看看把MyStack直接用linkedList,查询的结果集确实非常大

int[] n = { 1, 2, 5, 6, 7, 10, 12, 15, 20, 23, 24, 26, 29,30,31,33,40,55,59,66,88
,100,111,123,140,150,180,200,211,222,332,332,400,451,900,1223,2203,2234,5552};
        int t=6000;
效率我觉得还是比较高的,一秒钟差不多10W条数据吧
这个结果集至少超过10G。。。

不过我跑100条是指找出所有的情况,你一秒钟差不多10W条数据是什么个情况
2012年1月31日 09:19

12个答案 按时间排序 按投票排序

0 0

采纳的答案

 /**
     * match(深度匹配,参数:数组n[],查询值t,截止位置end,查询记录栈stack,深度deep)
     * MyStack 以LinkedList为基础的stack简单的pop push操作,重写toString 使用list.toString()
    */
    public static void match(int[]n,int t,int end,MyStack stack,int deep){
        for(int i=leftApproachT(n, t,end);i>=0;i--){
          int temp=t-n[i];
          int temp2 =deep;
          stack.push(n[i]);
            if(temp>0) {
                match(n, temp,i,stack,temp2++);
            }
            else if(temp==0){
                System.out.println(stack);
                }
            //将不需要的数据出栈
            for(int j=deep;j>=0;j--)
                stack.pop();
        }
    }
    /**
     * leftApproachT(从左开始查询最接近t的值所在数组n中对应的位置)
    */
    public static int leftApproachT(int[]n,int t,int end){
      for(int i=0;i<end;i++){
          if(n[i]>t) return i-1;
      }
      return end-1;
    }
    


判断出来没什么难度,把结果也都打出来

2012年2月02日 13:55
0 0

拿楼主给的例子,我用流将结果集写出,1个小时差不多写了10G
总的结果集大小我估计比50G大的多,这么大的结果集,想比较短的时间算出来基本不可能

2012年2月06日 14:32
0 0

我刚试过了,oom没有遇到,你看看把MyStack直接用linkedList,查询的结果集确实非常大

int[] n = { 1, 2, 5, 6, 7, 10, 12, 15, 20, 23, 24, 26, 29,30,31,33,40,55,59,66,88
,100,111,123,140,150,180,200,211,222,332,332,400,451,900,1223,2203,2234,5552};
        int t=6000;
效率我觉得还是比较高的,一秒钟差不多10W条数据吧
这个结果集至少超过10G。。。

2012年2月06日 11:23
0 0

public class Test {

	private static int count = 0;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] a = { 1, 2, 5, 6, 7, 10, 12, 15, 20, 23, 24, 26, 29 };
		System.out.print(isMatch(a, 50));
	}

	public static boolean isMatch(int[] array, int target) {
		Arrays.sort(array);
		LinkedList<Integer> stack = new LinkedList<Integer>();
		findMatch(array, 0, target, stack);
		return count > 0;
	}

	public static void findMatch(int[] array, int start, int target,
			LinkedList<Integer> stack) {
		for (int i = start; i < array.length; i++) {
			if (array[i] == target) {
				stack.push(array[i]);
				printStack(stack);
				count++;
				stack.pop();
			} else if (array[i] < target) {
				stack.push(array[i]);
				findMatch(array, i + 1, target - array[i], stack);
				stack.pop();
			} else {
				return;
			}
		}

	}

	public static void printStack(List<Integer> stack) {
		System.out.print("find a solution: ");
		for (int i : stack) {
			System.out.print(i + " ");
		}
		System.out.println();
	}

}


find a solution: 29 7 6 5 2 1
find a solution: 26 10 6 5 2 1
find a solution: 24 12 6 5 2 1
find a solution: 23 12 7 5 2 1
find a solution: 20 15 7 5 2 1
find a solution: 20 12 10 5 2 1
find a solution: 24 10 7 6 2 1
find a solution: 29 12 6 2 1
find a solution: 26 15 6 2 1
find a solution: 20 15 12 2 1
find a solution: 24 23 2 1
find a solution: 26 12 6 5 1
find a solution: 23 15 6 5 1
find a solution: 15 12 10 7 5 1
find a solution: 29 15 5 1
find a solution: 24 20 5 1
find a solution: 26 10 7 6 1
find a solution: 24 12 7 6 1
find a solution: 23 20 6 1
find a solution: 20 12 10 7 1
find a solution: 24 15 10 1
find a solution: 29 20 1
find a solution: 26 23 1
find a solution: 20 10 7 6 5 2
find a solution: 15 12 10 6 5 2
find a solution: 26 10 7 5 2
find a solution: 24 12 7 5 2
find a solution: 23 20 5 2
find a solution: 23 12 7 6 2
find a solution: 20 15 7 6 2
find a solution: 20 12 10 6 2
find a solution: 29 12 7 2
find a solution: 26 15 7 2
find a solution: 26 12 10 2
find a solution: 23 15 10 2
find a solution: 20 12 7 6 5
find a solution: 29 10 6 5
find a solution: 24 15 6 5
find a solution: 26 12 7 5
find a solution: 23 15 7 5
find a solution: 23 12 10 5
find a solution: 20 15 10 5
find a solution: 15 12 10 7 6
find a solution: 29 15 6
find a solution: 24 20 6
find a solution: 23 20 7
find a solution: 23 15 12
find a solution: 26 24
true

2012年2月02日 15:27
0 0

public static void match(int[]n,int t){
        for(int i=leftApproachT(n, t);i>=0;i--){
          int temp=t-n[i];
            if(temp>0) {
                match(n, temp);
            }
            else if(temp==0){System.out.println("find");}
        }
    }
    public static int leftApproachT(int[]n,int t){
        for(int i=0;i<n.length;i++){
            if(n[i]>t) return i-1;
        }
        return n.length-1;
    }

2012年2月02日 10:51
0 0

上面的只是一种思路,不保证代码可运行,以及效率

2012年2月02日 10:40
0 0

反过来想,不是拆整数,用拆数组的办法试试

提供思路如下:
假设数组为a0, a1, a2,..., an-1, an,要匹配的数为M
采用下法来判断:

if an == M, 这时候当然找到了,返回true
如果不匹配,那么再check a0, a1, a2, ..., an-1 这个子数组与 M 或者 M - an是否匹配,如果匹配,就返回true,否则返回false;当然我没考虑效率哈。

boolean isMatch(double[]array,double target){  

  return isMatch(array, target, array==null?0:array.length());
} 

boolean isMatch(double[]array,double target, int index){
  if(array == null || array.length() < index + 1 || index < 0){
     return false;
  }

  if(array[index] == target){
     return true;
  }
  return isMatch(array, target, index - 1) || 
  return isMatch(array, target - array[index], index - 1);
}

2012年2月02日 10:38
0 0

用动态规划。越到后面效率约高

2012年2月01日 17:20
0 0

本质上就是整数分解的问题

2012年2月01日 16:06
0 0

数组先排序~
例子:[1,2,5,6,7,10,12,15,20,23,24,26,29] 50
循环取1、2。。。、29
开始从深度挖掘取1 ,剩余49 寻找最接近49的数 29剩余 20 ok找到20 然后后退看有没有能代理20的 找15 剩余5 找到5, 在用12 。。。
基本就是过程
1 29 20
1 29 15 5
1 29 12 6 2
1 29 10 就不行了 然后 pop 29
1 26 23
。。。。
思路有点乱,利用堆栈~

2012年1月31日 17:04
0 0

如果只是返回boolean,有必要分那么多步判断么?而且你自己既然已经有思路,那么希望得到的是什么呢?

2012年1月31日 14:04
0 0

楼主换了个分多的号来了。。。
那个我觉得应该用深度搜索来解吧,你这个直接限定死了

2012年1月31日 13:18

相关推荐

    C# 用分治法算假币问题

    在IT领域,分治法是一种常用的算法设计策略,它将复杂的问题分解成多个较小的相似子问题,分别解决后再合并结果。在这个特定的场景中,我们面对的是一个经典的“假币问题”,这个问题源自古老的天平秤谜题。在这个...

    分治法求最近点对

    学习如何将最近点对问题划分为子问题,如矩形区域内的最近点对查找。 2. **最近点对算法**:研究不同的算法,如线性扫描、排序后扫描、基于数据结构(如kd树、B树)的算法等,了解它们的时间复杂度和适用场景。 3. *...

    回溯法求解子集和问题

    回溯法是一种强大的算法策略,常用于解决组合优化问题,如子集和问题。这个问题的目标是从给定的一组整数中找出所有可能的子集,使得这些子集的元素和等于一个特定的目标值。在本案例中,我们将深入探讨如何使用回溯...

    算24点 算法经典 回溯法

    这种问题的解决方法之一就是采用算法中的回溯法。 回溯法是一种试探性的解决问题的方法,它尝试逐步构造可能的解决方案,如果在构建过程中发现当前选择不能导致有效解,就回溯到上一步,尝试其他可能性。在算24点的...

    序关系分析法、熵权法、反熵权法、TOPSIS应用算例详细分析文献

    【序关系分析法】 序关系分析法,也称为秩次相关分析,是一种评估和比较不同对象的方法。...通过对多个模拟算例的分析,验证了该模型的有效性和实用性,为电力系统的可持续发展提供了科学的决策依据。

    Apriori算法源代码

    Apriori算法源代码 Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法

    装载问题(回溯法)报告.doc

    【装载问题(回溯法)】是算法设计与分析领域中的一个重要问题,主要涉及如何高效地安排多个集装箱的装载,以充分利用两艘轮船的载重能力。此问题可以通过回溯法来解决,这是一种试探性的搜索策略,适用于解决约束...

    MATLAB遗传算法源代码

    通过深入研究和调试这个MATLAB遗传算法源代码,你可以掌握如何将遗传算法应用于实际工程问题,例如函数优化、机器学习参数调整、电路设计等领域。记得在使用或修改代码时,充分理解每个部分的作用,以便有效地解决...

    《除数是一位数的笔算除法》的算理和算法教学.docx

    根据给定文件的信息,我们可以详细地探讨《除数是一位数的笔算除法》的算理和算法教学的相关知识点。 ### 1. 算理和算法的基本概念 #### 算理 算理指的是计算过程中的思维方式和原理,它是解决为什么采用某种计算...

    Dijkstra算法源代码

    在这个名为"Dijkstra算法源代码"的压缩包中,我们可以期待找到一个详细的Dijkstra算法实现,该实现不仅包含算法的核心逻辑,还可能有详尽的注释以便理解。"直接运行"的特性意味着这个源代码文件可以在Visual C++ 6.0...

    MATLAB算法源代码.zip

    在"MATLAB算法源代码.zip"的子文件中,我们看到的".rar"文件可能包含的是各个独立的案例,每个案例可能涵盖了一个或多个特定主题。例如,1 (12).rar可能是一个关于傅立叶变换的应用,1 (13).rar可能涉及矩阵操作和解...

    基本蚁群算法源代码

    以下是对基本蚁群算法源代码的理解和相关知识点: 1. **概念理解**:ACO通过模拟蚂蚁在寻找食物过程中留下的信息素痕迹来指导搜索过程。每只蚂蚁代表一个可能的解决方案,它们在解空间中随机探索,同时会根据当前...

    PQ.rar_PQ分解法_pq分解法算例_stochastic_stochastic power_电力系统潮流计算

    在这个压缩包中,"PQ分解法算例"可能包含了一个具体的计算案例,展示了如何运用PQ分解法处理包含随机因素的潮流问题。通过这个实例,用户可以学习到如何设置问题,如何定义PQ和PV节点,以及如何处理随机变量。这个算...

    三年级数学下册2除数是一位数的除法2笔算除法2一位数除三位数的笔算除法一位数除三位数的笔算除法没有余数预习课件新人教版

    三年级数学下册2除数是一位数的除法2笔算除法2一位数除三位数的笔算除法一位数除三位数的笔算除法没有余数预习课件新人教版

    三年级下除数是一位数的除法笔算练习题集.doc

    总的来说,这些除数是一位数的除法笔算练习题,是三年级学生巩固除法运算的重要工具,它们提供了丰富的实例,让学生在实践中不断巩固和深化对除法的理解,为后续的数学学习打下坚实的基础。教师和家长可以引导孩子逐...

    SURF算法源代码

    总的来说,"SURF算法源代码"提供了实践SIFT与SURF算法的宝贵材料,对于想要深入学习和应用这两种技术的人来说,这是一个很好的起点。通过阅读、理解和修改这些代码,我们可以更好地掌握计算机视觉领域中的关键点检测...

    汽车车牌号识别算法源代码

    在这个项目中,我们关注的是一个使用C++语言实现的车牌识别算法源代码。 首先,我们要理解车牌识别的基本流程。通常,这个过程包括预处理、特征提取、字符分割和字符识别四个主要步骤: 1. **预处理**:在对车牌...

    有限体积法的粘性力矩问题及其改进

    杨振针对上述问题,提出了一种新的算法,作为对常规有限体积法的改进。该算法的基本思路是引入了一个新的物理假设,即“流体微元可以自由旋转”。在此基础上,补充建立了一个角动量方程。通过这个角动量方程,与原有...

    遗传算法源程序.zip_WVXB_split5nm_单目标_多目标_遗传算法源程序

    在这个"遗传算法源程序.zip_WVXB_split5nm_单目标_多目标_遗传算法源程序"的压缩包中,包含了用于解决单目标和多目标优化问题的源代码。这种算法在处理复杂、非线性或难以解析的工程问题时特别有效。 首先,让我们...

    分枝界定法和匈牙利法算法源代码

    在这个特定的问题中,分枝界定法用于寻找总成本最小的资源分配方案,而匈牙利算法则可能被用于更复杂的任务分配问题,比如在有限资源下,如何合理地分配任务给多个执行者,使得总体成本最低或效率最高。两者的应用都...

Global site tag (gtag.js) - Google Analytics