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

简介: 这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和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、基于减治法思想实现二叉查找树的插入与查找的测试用例结果截图

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

相关文章
|
4天前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
35 15
|
11天前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
3月前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
103 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
6天前
|
存储 人工智能 算法
通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统
阿里云向量检索服务Milvus 2.5版本在全文检索、关键词匹配以及混合检索(Hybrid Search)方面实现了显著的增强,在多模态检索、RAG等多场景中检索结果能够兼顾召回率与精确性。本文将详细介绍如何利用 Milvus 2.5 版本实现这些功能,并阐述其在RAG 应用的 Retrieve 阶段的最佳实践。
通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统
|
12天前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
27 3
|
22天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
47 12
|
20天前
|
算法 安全 网络安全
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
49 9
|
13天前
|
算法 安全 Java
探讨组合加密算法在IM中的应用
本文深入分析了即时通信(IM)系统中所面临的各种安全问题,综合利用对称加密算法(DES算法)、公开密钥算法(RSA算法)和Hash算法(MD5)的优点,探讨组合加密算法在即时通信中的应用。
15 0
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
解锁机器学习的新维度:元学习的算法与应用探秘
元学习作为一个重要的研究领域,正逐渐在多个应用领域展现其潜力。通过理解和应用元学习的基本算法,研究者可以更好地解决在样本不足或任务快速变化的情况下的学习问题。随着研究的深入,元学习有望在人工智能的未来发展中发挥更大的作用。
|
2月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。