【算法设计与分析】— —实现最优载的贪心算法

简介: 【算法设计与分析】— —实现最优载的贪心算法

🎯目的:


1)了解贪心算法思想及基本原理;


2)掌握使用贪心算法求解问题的一般特征;


3)能够针对实际问题,能够正确选择贪心策略;


4)能够针对选择的贪心策略,证明算法的正确性;


5)能够根据贪心策略,正确编写代码;


6)能够正确分析算法的时间复杂度和空间复杂度。


🎯内容:

实现最优装载的贪心算法。

测试数据可选用:

假设轮船限重12kg

i

1

2

3

4

5

Wi(kg)

8

4

2

5

7


🎯代码(Java):

package one;
 
import java.util.Vector;
 
public class Two {
 
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    thing t1 = new thing(1, 8);
    thing t2 = new thing(2, 4);
    thing t3 = new thing(3, 2);
    thing t4 = new thing(4, 5);
    thing t5 = new thing(5, 7);
    Vector<thing> v = new Vector<thing>();
    v.add(t1);
    v.add(t2);
    v.add(t3);
    v.add(t4);
    v.add(t5);
    // 按重量排序
    for (int i = 0; i < 5; i++) {
      for (int j = 0; j < 4 - i; j++) {
        if (v.get(j).Wi > v.get(j + 1).Wi) {
          thing t = v.get(j);
          v.set(j, v.get(j + 1));
          v.set(j + 1, t);
        }
      }
    }
    int w = 0;
    int Weight = 12;
    System.out.println("选中的编号为:");
    for (int i = 0; i < 5; i++) {
      if (v.get(i).Wi + w <= Weight) {
        w += v.get(i).Wi;
 
        System.out.println(v.get(i).x);
      }
    }
  }
}
 
class thing {
  int x;
  int Wi;
 
  public thing(int x, int wi) {
    super();
    this.x = x;
    Wi = wi;
  }
 
  @Override
  public String toString() {
    return "thing [x=" + x + ", Wi=" + Wi + "]";
  }
 
}


🎯 运行结果:


🎯算法分析:


当储存n个对象时,


1.时间复杂度分析:


  • 对于排序操作,这里使用的是冒泡排序的方法,外层循环n次,内层循环了(n-1)次、(n-2)次、(n-3)次...1次,因此,排序操作的时间复杂度为O(n+(n-1)+(n-2)+...+1)=O(n^2).
  • 循环遍历vector的元素,执行n次,因此,该循环的时间复杂度为:O(n^2)。

综上所述:整段代码在存储n个对象时的时间复杂度为O(n^2)。


2.空间复杂度分析:


  • 声明了一个Vector对象v,其存储n个thing对象。因此,存储空间复杂度为:O(n)。
  • 声明了若干个int类型的变量w、weight、以及n个thing对象。因为这些变量和对象的数量随着输入规模的增加而增加,所以额外的时间复杂度可以看作O(n)。

综上所述,整段代码在存储n个对象的空间复杂度为O(n)。


       需要注意的是,上述分析假设输入规模n是固定的。如果输入规模n增加,例如thing对象的个数增加时,时间复杂度和空间复杂度可能会发生变化。但在给定的固定输入规模下,该代码的时间复杂度为O(n^2),空间复杂度为O(n)。因此,在处理大规模输入时要注意性能问题。


🎯其他程序语言的实现:

注:以下代码均有ai生成,读者如发现bug可以发在评论区,咱们一起解决❤️!

🎐c语言程序:

#include <stdio.h>
 
typedef struct {
    int x;
    int Wi;
} Thing;
 
void bubbleSort(Thing arr[], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j].Wi > arr[j + 1].Wi) {
                Thing temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}
 
int main() {
    Thing t1 = {1, 8};
    Thing t2 = {2, 4};
    Thing t3 = {3, 2};
    Thing t4 = {4, 5};
    Thing t5 = {5, 7};
    Thing v[5] = {t1, t2, t3, t4, t5};
    int size = 5;
    int w = 0;
    int Weight = 12;
 
    bubbleSort(v, size);
 
    printf("选中的编号为:\n");
    for (int i = 0; i < size; i++) {
        if (v[i].Wi + w <= Weight) {
            w += v[i].Wi;
            printf("%d\n", v[i].x);
        }
    }
 
    return 0;
}


注意事项:

  • 在C语言中,没有直接对应Java的Vector类,而是使用了数组。
  • 在C语言中,没有自带的冒泡排序函数,需要实现自己的排序逻辑。


🎐 python代码:

class Thing:
    def __init__(self, x, Wi):
        self.x = x
        self.Wi = Wi
 
t1 = Thing(1, 8)
t2 = Thing(2, 4)
t3 = Thing(3, 2)
t4 = Thing(4, 5)
t5 = Thing(5, 7)
v = [t1, t2, t3, t4, t5]
 
# 按重量排序
for i in range(5):
    for j in range(4 - i):
        if v[j].Wi > v[j + 1].Wi:
            v[j], v[j + 1] = v[j + 1], v[j]
 
w = 0
Weight = 12
print("选中的编号为:")
for i in range(5):
    if v[i].Wi + w <= Weight:
        w += v[i].Wi
        print(v[i].x)



注意事项:


  • Python中没有严格定义类的访问修饰符,所以不需要使用public关键字。
  • Python中的列表使用方括号[]表示,而不是Java中的Vector。
  • 在Python中,排序可以使用列表的sort()方法或者sorted()函数进行。在这里简单起见,使用了冒泡排序算法。


🎐C++代码:

#include <iostream>
#include <vector>
using namespace std;
 
class Thing {
public:
    int x;
    int Wi;
 
    Thing(int x, int wi) {
        this->x = x;
        Wi = wi;
    }
 
    string toString() {
        return "thing [x=" + to_string(x) + ", Wi=" + to_string(Wi) + "]";
    }
};
 
int main() {
    Thing t1(1, 8);
    Thing t2(2, 4);
    Thing t3(3, 2);
    Thing t4(4, 5);
    Thing t5(5, 7);
 
    vector<Thing> v;
    v.push_back(t1);
    v.push_back(t2);
    v.push_back(t3);
    v.push_back(t4);
    v.push_back(t5);
 
    // 按重量排序
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 4 - i; j++) {
            if (v[j].Wi > v[j + 1].Wi) {
                Thing t = v[j];
                v[j] = v[j + 1];
                v[j + 1] = t;
            }
        }
    }
 
    int w = 0;
    int Weight = 12;
    cout << "选中的编号为:" << endl;
    for (int i = 0; i < 5; i++) {
        if (v[i].Wi + w <= Weight) {
            w += v[i].Wi;
            cout << v[i].x << endl;
        }
    }
 
    return 0;
}


注意事项:

  • C++中使用#include <vector>引入向量(Vector)的类。
  • 在C++中,使用push_back()方法向向量中添加元素。
  • 在C++中,使用coutendl来进行输出。
相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
60 4
|
12天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
29 2
|
25天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
1月前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
1月前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
2月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
58 4
|
1月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
41 1
|
2月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
125 19
|
2月前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
50 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计