数据结构与算法分析(第一篇-算法学习)

仅作为学习数据结构与算法分析边通过微博记录。

了解数据结构与算法,首先是几个数学定义需要记住:

        1.指数-

        2.对数,换底等

        3.级数,

1.递归简论,之后几章会更详尽的去讨论递归

  首先我们先设定一个简单的递归公式:f(0)=0,且f(x)=2f(x-1)+x^2.

   用程序实现既为:

public static int f(int x){
        if(x==0)
            return 0;
        else 
            return 2*f(x-1)+x*x;
    }

这是最简单的递归,但是已经包含了四条我们需要记住的基本原则:1.基准情形-x==0

                                                                                          2.不断推进-即递归调用不断向基准情况推进

                                                                                          3.设计法则-假设所有的递归调用都能运行

                                                                                          4.合成效益法则-解决一个问题统一实力避免不同递归重复

2.算法分析

这个比较那理解,实际上他就是通过大O标记法,去计算程序的相对增长率,即当我们当我们的程序运行的时候通过子序运算计算程序的运算耗时轨迹。

       比如说运行时间计算:据一个简单级数这个公式我用键盘不容易打,即算N个i的3次方,大家看代码即可

public static int sum(int n){
        int partialSum = 0;
        for(int i = 1; i <= n; i++)
            partialSum += i * i * i;
        
        return partialSum;
    }

分析这段程序,首先所有声明不计,两次乘法,一次加法和一次赋值,占用四个时间单元,i<=n和自增和赋值属于隐藏开销。

所有这些总的初始化算1个单元时间,所有测试为N+1个单元时间,自增运算为N个单元时间,总共2N+2个单元时间。

    还有调用方法和返回值的开销,总量6N+4个单元时间

用大O标记法,我们应该说该方法是O(N)。

  一般法则

         法则1-for循环

                    运行时间为。内部运行时间✖️迭代次数

         法则2-嵌套for循环

                     运行时间。(外层*内层)内部运行时间✖️(外层*内层)迭代次数,即O(N^2)

         法则3-顺序语句

                     有两个顺序for循环即已最大运行时间为准,即O(N)->O(N^2)总量即O(N^2)

        法则4-if/else语句

                    时间即从运行最长的一件为基准,O(N)


3.简单算法

次处我就贴上几个简单的算法小程序方便大家阅读

折半查找法

public static <AnyType extends Comparable<? super AnyType>> int binarySearch(AnyType[] a, AnyType x){
        //范型类的应用,这块在算法里面有讲过,我没记录博客,需要了解百度即可
        int low =0,high =a.length-1;
        while (low<=high){
            int mid = (low + high)/2;
            if(a[mid].compareTo(x)<0)
                low=mid+1;
            else if(a[mid].compareTo(x)>0)
                high=mid -1;
            else 
                return mid;
        }
        return -1;
    }

欧几里得算法

public static long gcd(long m,long n){
        while (n!=0){
            long rem = m%n;
            m =n ;
            n =rem;
        }
        return m;
    }

幂运算

public static long pow(long x, int n){
        if (n==0)
            return 1;
        if (n==1)
            return x;
        if (isEven(n))
            return pow(x*x,n/2);
        else
            return pow(x*x,n/2)*x;
    }
    public static boolean isEven(int n){
        return n % 2 == 0;
    }

猜你喜欢

转载自blog.csdn.net/weixin_37352094/article/details/80593239