遍历组合算法的模块化

简介:

在日常的需求设计中,遍历组合是一个常见的问题。

  例如:现在有N个不同的数。要求在其中找到M个数,使得M个数之和为指定的S,求所有满足条件的组合。

  这是一个很明显的遍历组合的问题。一般采用递推算法,求出满足条件的解。

  这类问题一般都采用一个数组P,来存放解。遍历整个组合空间,来找出解(有可能是所有解、也可能是一个解,根据题目要求来定)

  由于这类问题解法是固定的,故在此把该算法模块化。留待日后查阅用。

  

 

  上图是该算法的算法流程图

  下面贴出该算法的伪代码,用的是VB2005

  Public Sub Traversal()
Dim P() As Integer, K As Integer, IsGroup As Boolean

    InitData()                        注:初始化数组代码块

    K = P.GetUpperBound(0)

    Do
If IsMatch()  Then                  注:判别是否满足条件的代码块
OutputAnswer()                  注:输出解的代码块
End If

      IsGroup = False

      Do
Delta(K)                     注:P(K)自增加值的代码块
Do
If Overflow(K) Then             注:判断P(K)是否越界的代码块
K = K - 1
Exit Do
Else
If K < P.GetUpperBound(0) Then
K = K + 1
SetP(K)                注:依据条件设置P(K)值的代码块
Else
IsGroup = True
Exit Do
End If

          End If
Loop
Loop Until (K < 0 Or IsGroup = True)

    Loop Until K < 0

    SomeEndCode()                      注:求解结束的代码块

  End Sub

 

  举例说明:有1、4、7、2、5、6、9、8、7、5十个数,求四个数之和为20的所有组合。

  分别阐述各个代码块的实现

  初始化数组代码块:

    Dim N() As Integer={1,4,7,2,5,6,9,8,7,5}

    Redim P(3)

    P(0)=0:P(1)=1:P(2)=2:P(3)=3

  判别是否满足条件的代码块:

    N(P(0))+N(P(1))+N(P(2))+N(P(3))=20

  输出解的代码块:

    Debug.Print N(P(0)) & "," & N(P(1)) & "," & N(P(2)) & "," & N(P(3))

  P(K)自增加值的代码块:

    P(K)=P(K)+1

  判断P(K)是否越界的代码块

    P(K)>K+6

  依据条件设置P(K)值的代码块:

    P(K)=P(K-1)+1

  求解结束的代码块

    本题没必要设置这段代码

 

  故本题的代码如下:

  Public Sub Traversal()
Dim P() As Integer, K As Integer, IsGroup As Boolean

    Dim N() As Integer={1,4,7,2,5,6,9,8,7,5}

    Redim P(3)

    P(0)=0:P(1)=1:P(2)=2:P(3)=3

    K = P.GetUpperBound(0)

    Do
If N(P(0))+N(P(1))+N(P(2))+N(P(3))=20  Then       
Debug.Print N(P(0)) & "," & N(P(1)) & "," & N(P(2)) & "," & N(P(3))

      End If

      IsGroup = False

      Do
P(K)=P(K)+1
Do
If P(K)>K+6 Then  
K = K - 1
Exit Do
Else
If K < P.GetUpperBound(0) Then
K = K + 1
              P(K)=P(K-1)+1
Else
IsGroup = True
Exit Do
End If

          End If
Loop
Loop Until (K < 0 Or IsGroup = True)

    Loop Until K < 0

  End Sub

 

  把这类问题模块化,以后碰到类似的问题。直接修改各个代码块的代码。

  著文以记之。


    本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/archive/2010/06/10/1755918.html,如需转载请自行联系原作者


相关文章
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
331 64
|
11月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
464 3
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
324 5
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
297 2
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
654 0
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
315 0
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
226 0
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
204 0
|
2月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
153 2
|
3月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
204 3

热门文章

最新文章