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


    🎃欢迎大家前去观看我的算法设计与分析专栏: 算法设计与分析_IT闫的博客-CSDN博客 希望对大家有所帮助!


    🎃个人专栏:

    🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

    🐳Java基础Java基础_IT闫的博客-CSDN博客

    🐋c语言:c语言_IT闫的博客-CSDN博客

    🐟MySQL:数据结构_IT闫的博客-CSDN博客

    🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

    💎C++:C++_IT闫的博客-CSDN博客

    🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

    💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

    🥏python:python_IT闫的博客-CSDN博客

    欢迎收看,希望对大家有用!

    目录

    🎯目的:

    🎯内容:

     🎯代码(Java):

    🎯 运行结果:

    🎯算法分析:

    🎯其他程序语言的实现:

    🎐c语言程序:

    🎐 python代码:

    🎐C++代码: 


    🎯目的:

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

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

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

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

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

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

    🎯内容:

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

    测试数据可选用:

    假设轮船限重12kg

    i

    1

    2

    3

    4

    5

    Wi(kg)

    8

    4

    2

    5

    7

     🎯代码(Java):

    1. package one;
    2. import java.util.Vector;
    3. public class Two {
    4. public static void main(String[] args) {
    5. // TODO Auto-generated method stub
    6. thing t1 = new thing(1, 8);
    7. thing t2 = new thing(2, 4);
    8. thing t3 = new thing(3, 2);
    9. thing t4 = new thing(4, 5);
    10. thing t5 = new thing(5, 7);
    11. Vector v = new Vector();
    12. v.add(t1);
    13. v.add(t2);
    14. v.add(t3);
    15. v.add(t4);
    16. v.add(t5);
    17. // 按重量排序
    18. for (int i = 0; i < 5; i++) {
    19. for (int j = 0; j < 4 - i; j++) {
    20. if (v.get(j).Wi > v.get(j + 1).Wi) {
    21. thing t = v.get(j);
    22. v.set(j, v.get(j + 1));
    23. v.set(j + 1, t);
    24. }
    25. }
    26. }
    27. int w = 0;
    28. int Weight = 12;
    29. System.out.println("选中的编号为:");
    30. for (int i = 0; i < 5; i++) {
    31. if (v.get(i).Wi + w <= Weight) {
    32. w += v.get(i).Wi;
    33. System.out.println(v.get(i).x);
    34. }
    35. }
    36. }
    37. }
    38. class thing {
    39. int x;
    40. int Wi;
    41. public thing(int x, int wi) {
    42. super();
    43. this.x = x;
    44. Wi = wi;
    45. }
    46. @Override
    47. public String toString() {
    48. return "thing [x=" + x + ", Wi=" + Wi + "]";
    49. }
    50. }

    🎯 运行结果:

    🎯算法分析:

    当储存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语言程序:

    1. #include
    2. typedef struct {
    3. int x;
    4. int Wi;
    5. } Thing;
    6. void bubbleSort(Thing arr[], int n) {
    7. for (int i = 0; i < n; i++) {
    8. for (int j = 0; j < n - i - 1; j++) {
    9. if (arr[j].Wi > arr[j + 1].Wi) {
    10. Thing temp = arr[j];
    11. arr[j] = arr[j + 1];
    12. arr[j + 1] = temp;
    13. }
    14. }
    15. }
    16. }
    17. int main() {
    18. Thing t1 = {1, 8};
    19. Thing t2 = {2, 4};
    20. Thing t3 = {3, 2};
    21. Thing t4 = {4, 5};
    22. Thing t5 = {5, 7};
    23. Thing v[5] = {t1, t2, t3, t4, t5};
    24. int size = 5;
    25. int w = 0;
    26. int Weight = 12;
    27. bubbleSort(v, size);
    28. printf("选中的编号为:\n");
    29. for (int i = 0; i < size; i++) {
    30. if (v[i].Wi + w <= Weight) {
    31. w += v[i].Wi;
    32. printf("%d\n", v[i].x);
    33. }
    34. }
    35. return 0;
    36. }

     注意事项:

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

    🎐 python代码:

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

    注意事项:

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

    🎐C++代码: 

    1. #include
    2. #include
    3. using namespace std;
    4. class Thing {
    5. public:
    6. int x;
    7. int Wi;
    8. Thing(int x, int wi) {
    9. this->x = x;
    10. Wi = wi;
    11. }
    12. string toString() {
    13. return "thing [x=" + to_string(x) + ", Wi=" + to_string(Wi) + "]";
    14. }
    15. };
    16. int main() {
    17. Thing t1(1, 8);
    18. Thing t2(2, 4);
    19. Thing t3(3, 2);
    20. Thing t4(4, 5);
    21. Thing t5(5, 7);
    22. vector v;
    23. v.push_back(t1);
    24. v.push_back(t2);
    25. v.push_back(t3);
    26. v.push_back(t4);
    27. v.push_back(t5);
    28. // 按重量排序
    29. for (int i = 0; i < 5; i++) {
    30. for (int j = 0; j < 4 - i; j++) {
    31. if (v[j].Wi > v[j + 1].Wi) {
    32. Thing t = v[j];
    33. v[j] = v[j + 1];
    34. v[j + 1] = t;
    35. }
    36. }
    37. }
    38. int w = 0;
    39. int Weight = 12;
    40. cout << "选中的编号为:" << endl;
    41. for (int i = 0; i < 5; i++) {
    42. if (v[i].Wi + w <= Weight) {
    43. w += v[i].Wi;
    44. cout << v[i].x << endl;
    45. }
    46. }
    47. return 0;
    48. }

    注意事项:

    • C++中使用#include 引入向量(Vector)的类。
    • 在C++中,使用push_back()方法向向量中添加元素。
    • 在C++中,使用coutendl来进行输出。 
  • 相关阅读:
    CLIP论文解读
    小白必看,手把手教你重装系统
    flume 采集指定端口的日志
    【UV打印机】波形开发-喷头工作原理(一)
    【C语言】动态通讯录(超详细)
    serverSocket编程DEMO
    关于Linux下Redis自动化部署的一些笔记
    ChatGpt介绍和国产ChatGpt对比
    如何快速实现Modbus RTU和Modbus TCP协议转换?
    linux进阶-文件目录
  • 原文地址:https://blog.csdn.net/shsjssnn/article/details/133685230