• 数据结构和算法示例一


    程序等于数据架构加算法,一个好的算法可以有效的提高程序整体的性能体现。举一个最简单的例子:解析三元一次方程组,假设现在手上有一块的硬币,还有合计50个1分、2分、5分的硬币,现在要把1块钱的硬币全部换成以分为单位的硬币,大概有多少种换法?

    根据题意,假设最后换成的硬币组成包括i枚1分的硬币、j枚2分的硬币、k枚5分的硬币,则可列出三元一次方程组如下:i+j+k=50;i+2j+5k=100;

    方程组的解析用程序来实现有三种实现方式,分别对应的运算次数为n的立方、n的平方、n。

    1. 第一种计算方式是直接用三层嵌套循环来运算,这样能算出来结果,但算法复杂度为n的立方,如示例代码中的doMethod1方法。
    2. 第二种计算方式是用两层嵌套循环来运算,算法复杂度为n的平方,如示例代码中的doMethod2。
    3. 第三计算方式是只用一层循环来运算,但需要通过转换,将两个方程左右分别相减,最后得到一个二元一次方程,这样就只需要循环一次即可,如示例代码中的doMethod3。
      1. package dataStructure;
      2. import java.util.Arrays;
      3. /*
      4. * 通过分硬币问题,研究算法对性能的影响
      5. * 假设1块钱,还有一分、2分、5分的硬币共50枚,现在讲1块钱全部换成分的硬币,大概有多少分法
      6. * 假设1分、2分、五分分别为x、y、z枚,则
      7. * x+y+z=50
      8. * x+2y+5z=100
      9. */
      10. public class Demo1 {
      11. public static void main(String args[]) {
      12. doMethod1();//循环三次,算法时间复杂度为n的立方
      13. System.out.println("---------");
      14. doMethod2();//循环两次,算法时间复杂度为n的平方
      15. System.out.println("---------");
      16. doMethod3();//循环一次,算法时间复杂度为n
      17. }
      18. public static void doMethod1() {
      19. //分别定义x,y,z的个位数为i,j,k
      20. for(int i=0;i<51;i++) {
      21. for(int j=0;j<51;j++) {
      22. for(int k=0;k<51;k++) {
      23. if((i+j+k==50)&& (i+2*j+5*k == 100)) {
      24. int[] array = {i,j,k};
      25. System.out.println("个数分别为:"+Arrays.toString(array));
      26. }
      27. }
      28. }
      29. }
      30. }
      31. public static void doMethod2() {
      32. //分别定义x,y的个位数为i,j,则y的个数为50-i-j
      33. for(int i=0;i<51;i++) {
      34. for(int j=0;j<51;j++) {
      35. if(i+2*j+5*(50-i-j)== 100) {
      36. int[] array = {i,j,50-i-j};
      37. System.out.println("个数分别为:"+Arrays.toString(array));
      38. }
      39. }
      40. }
      41. }
      42. /*
      43. * 分别定义x,y,z的个位数为i,j,k,
      44. * i+2j+5k=100
      45. * i+j+k=50
      46. * 将两个方程分别左右相减,得到
      47. * j+4k=50;
      48. */
      49. public static void doMethod3() {
      50. for(int j=0;j<51;j++) {
      51. for(int k=0;k<13;k++) {
      52. if(j+4*k == 50) {
      53. int[] array = {50-j-k,j,k};
      54. System.out.println("个数分别为:"+Arrays.toString(array));
      55. }
      56. }
      57. }
      58. }
      59. }

  • 相关阅读:
    数据结构与算法--001--时间和空间复杂度
    外贸展示型网站设计
    volatility, polarizability, viscosity, electronegativity & hydrogen bonding
    elementUI大文件分片上传
    【面向对象依赖关系概念总结】面向对象程序设计的五种依赖关系
    HarmonyOS NEXT应用开发案例——自定义TabBar
    Forkjoin -用来将大任务切分成多个小任务执行
    Vue进阶(幺叁幺):父子组件传值实现数据深拷贝_vue3拷贝父组件传来的值
    ESP32编译出现Cannot establish a connection to the component registry.报错
    linux免密
  • 原文地址:https://blog.csdn.net/sunny_daily/article/details/126413619