算法分析(蛮力法与减治算法应用实验报告)

简介: 这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和Java代码实现,同时分析了其时间效率;还介绍了基于减治法思想实现的二叉查找树的插入与查找,同样提供了伪代码、Java源代码实现和时间效率分析,最后展示了测试结果截图。

文章目录

    • 一、仿真名称
    • 二、仿真目的
  • 1.基于蛮力法思想实现
    • 1.1、 伪代码描述
    • 1.2、代码实现
    • 1.3、背包问题的时间效率分析
  • 2.基于减治法思想实现二叉查找树的插入与查找
    • 2.1 、二叉查找树的插入与查找的伪代码描述
    • 2.2、二叉查找树的插入与查找的源代码实现
    • 2.3、叉查找树的插入与查找的时间效率分析
  • 3、测试结果
    • 3.1、基于减治法思想实现二叉查找树的插入与查找的测试用例结果截图

一、仿真名称

蛮力法与减治算法应用

二、仿真目的

1.掌握蛮力法和减治法的基本思想;
2.学会运用蛮力法和减治算法解决实际系统设计应用中碰到的问题。

1.基于蛮力法思想实现

1.1、 伪代码描述

算法 solveKs(w,v,index,capacity)
//实现放入背包的物品价值最大化
//输入背包的容量capacity,价值v和质量w.存储了商品质量W[0…n-1]和价值的数组V[0…n-1]
//输出背包的最大价值
v←0,m←0
If index<0 and capacity<0
  Return 0
Else
res←solveKs(w,v,index-1,capacity)  //不存放第i个物品所得价值
  if
w[index]<=capacity
res←Math.max(res,v[index]+solveKs(w,v,index-1,capacity-w[index]//放入或者不放入第i个物品时,背包最大的价值。

Return res

1.2、代码实现

package com.back.cc;

import java.util.Scanner;

public class Test {

    public static void main(String[] args) {

        int capacity;// 容量
        int m;// 数量
        int w = 0;// 初始化背包重量
        int v = 0;// 初始化背包价值

        // 输入背包的容量和商品的数量
        System.out.println("请输入商品的数量:");
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();// 获得商品数量
        System.out.println("请输入背包的容量:");
        capacity = sc.nextInt();

        // 用数组存储商品的大小和价值

        int[] weight = new int[m];
        int[] values = new int[m];
        // 通过循环赋值
        for (int i = 0; i < m; i++) {
            System.out.println("请输入第" + (i + 1) + "个商品的质量:");
            weight[i] = sc.nextInt();
            System.out.println("请输入第" + (i + 1) + "个商品的价值:");
            values[i] = sc.nextInt();
        }

        //直接调用静态方法
        System.out.println("存放的最大价值:"+knapSack(weight, values, capacity));

//        long time1 = System.currentTimeMillis();
//        long time2 = System.currentTimeMillis();
//        int time = (int) ((time2 - time1) / 1000);
//        System.out.println("执行了:" + time + "秒!");

    }

    public static int knapSack(int[] w, int[] v, int C) {
        int size = w.length;
        return solveKS(w, v, size - 1, C);
    }

    private static int solveKS(int[] w, int[] v, int index, int capacity) {
        // 基准条件:如果索引无效或者容量不足,直接返回当前价值0
        if (index < 0 || capacity <= 0)
            return 0;

        // 不放第index个物品所得价值
        int res = solveKS(w, v, index - 1, capacity);
        // 放第index个物品所得价值(前提是:第index个物品可以放得下)
        if (w[index] <= capacity) {
            res = Math.max(res, v[index] + solveKS(w, v, index - 1, capacity - w[index]));
        }

        return res;
    }

}

1.3、背包问题的时间效率分析

将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。优化空间复杂度以上方法的时间和空间复杂度均为(V N).

2.基于减治法思想实现二叉查找树的插入与查找

2.1 、二叉查找树的插入与查找的伪代码描述

算法:find(v)
       //查找二叉树中的数据
      //输入数据
//输出:找到数据打印出数据,否则显示无数据
While a!=b do
    If a<b c←c.leftchild  //如果数据比根节点数据小,则将当前的根节点赋值左孩子
    Else c←c.rightchild
  Return c

算法:insert(treenode)
     //向二叉树插入数据
     //输入要插入的值
     //输出插入结束后的二叉树
   Current ←null ,parent←null a←1

If root==null 
Root=newnode
Else
  Current=root
  While a do
If b<c 
   current←current.leftchild   //当前节点的左孩子赋值给当前节点。当前节点指向左子树
 if current==null
  parament.leftchild←b   //将新节点插入到左子树的空位置

else
current←current.rightchild
      if current==null
  parament.rightchild←b   //将新节点插入到右子树的空位置

2.2、二叉查找树的插入与查找的源代码实现


package com.find.insert;

class TreeNode{
    int value;
    TreeNode leftChild;
    TreeNode rightChild;

    public TreeNode() {
    }

    public TreeNode(int value) {
        this.value = value;
        leftChild = null;
        rightChild = null;
    }   

    public String toString() {
        return "Node [value=" + value +"]";
    }
}

package com.find.insert;

import java.util.LinkedList;
import java.util.Queue;

class Tree {
    TreeNode root = null;

    // 查找数据,找到数据打印出该节点
    /**
     * 查找原理:
     * 1、查找的数据和根节点的数值比较。相等返回根节点。
     * 2、小于根节点进入左子树查找
     * 3、大于根节点进入右子树查找
     * 4、左右子树都查找不到返回空值
     * 
     */
    public TreeNode find(int value) {
        TreeNode current = root;  //把根节点的值赋值给当前指向
        while (current.value != value) {
            if (value < current.value)
                current = current.leftChild;
            else
                current = current.rightChild;
            if (current == null)
                System.out.println("当前的二叉树没有此数值!!!");
        }
        return current;
    }

    public void insert(TreeNode treenode) {
        if (root == null) {
            root = treenode;
        } else {
            TreeNode current = root;
            TreeNode parent;
            while (true) {

                while (true) {
                    parent = current;//父节点

                    if (treenode.value < parent.value) {
                        current = current.leftChild;
                        if (current == null) {
                            parent.leftChild = treenode;
                            return;
                        }
                    } else {
                        current = current.rightChild;
                        if (current == null) {
                            parent.rightChild = treenode;
                            return;
                        }
                    }
                }
            }
        }
    }

    public void levelOrderByStack() {
        System.out.println("采用层次遍历二叉树:");
        if (root == null)
            return;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        while (queue.size() != 0) {
            int len = queue.size();
            for (int i = 0; i < len; i++) {
                TreeNode temp = queue.poll();// 出队列
                System.out.print(temp.value + " ");// 输出出队列的值
                if (temp.leftChild != null)
                    queue.add(temp.leftChild);
                if (temp.rightChild != null)
                    queue.add(temp.rightChild);
            }
        }

    }
}

package com.find.insert;

public class TreeDemo {
    public static void main(String[] args) {
        Tree tree = new Tree();
        TreeNode node1 = new TreeNode(2);
        TreeNode node2 = new TreeNode(1);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node5 = new TreeNode(5);
        TreeNode node6 = new TreeNode(6);
        tree.insert(node1);
        tree.insert(node2);
        tree.insert(node3);
        tree.insert(node4);
        tree.insert(node5);
        tree.insert(node6);

         //查找
        System.out.println(tree.find(3));

        //层次遍历
        tree.levelOrderByStack();
        System.out.println();
         //插入数据
        TreeNode node7 = new TreeNode(7);
        tree.insert(node7);
        //层次遍历
        tree.levelOrderByStack();
    }

2.3、叉查找树的插入与查找的时间效率分析

在构建二叉搜索树时,如果插入元素有序或接近有序,如 1 2 3 4 5 6,二叉搜索树退化成为一颗单支树,此时查找的时间复杂度为O(N),此时插入的效率也是O(N);如果左右子树都存在,存在叶子结点,查找的效率和插入的效率是二叉树的高度。

3、测试结果

3.1、基于减治法思想实现二叉查找树的插入与查找的测试用例结果截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章
|
3月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
121 0
|
2月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
187 3
|
2月前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
|
2月前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
2月前
|
存储 边缘计算 算法
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
|
2月前
|
机器学习/深度学习 算法 安全
小场景大市场:猫狗识别算法在宠物智能设备中的应用
将猫狗识别算法应用于宠物智能设备,是AIoT领域的重要垂直场景。本文从核心技术、应用场景、挑战与趋势四个方面,全面解析这一融合算法、硬件与用户体验的系统工程。
|
3月前
|
机器学习/深度学习 算法 5G
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
131 0
|
4月前
|
机器学习/深度学习 人工智能 算法
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
|
4月前
|
编解码 算法 5G
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
285 2
|
3月前
|
算法 数据可视化
matlab版本粒子群算法(PSO)在路径规划中的应用
matlab版本粒子群算法(PSO)在路径规划中的应用

热门文章

最新文章