算法--基础编程模型

来源:互联网 发布:洛奇英雄传单机版淘宝 编辑:程序博客网 时间:2024/05/16 16:56

参考书籍:《算法(第四版)》

了解

算法和数据结构相关联,为了实现算法,才需要组织数据,才产生了数据结构。数据结构是为了辅佐算法而来。
编写程序时,首要考虑正确性,这就包括了边界的考虑,输入的校验。保证正确的基础上才能去实现其他的算法,提高程序的性能。

基础

程序首要是考虑边界,例如以下程序计算2数之和:

public static int avg(int a, int b) {        return (a + b) / 2;    }

一般情况下是没有问题,当a或者b过大,接近于Integer.MAX_VALUE时,就会发生溢出情况。所以一般使用如下代码:

public static int avg(int a, int b) {        return a + (b -a) / 2;    }

如此就可以防止整数溢出问题了。
还有类似于2个数字交换等,例如:

a = a + b;b = a - b;a = a - b;

一样会产生整数越界问题,直接采用亦或更好一些。

二分查找算法

循环查找

 public static int rank(int key, int[] a) {        int lo = 0;        int hi = a.length - 1;        while (lo <= hi) {            int mid = lo + (hi - lo) / 2;            if (key < a[mid]) hi = mid - 1;            else if (key > a[mid]) lo = mid + 1;            else return mid;        }        return -1;    }

递归查找

注:
1.方法的第一句包含return语法。
2.递归尝试去解决规模更小的问题。
3.递归调用的父问题和尝试解决的子问题之间不应该有交集存在。(子问题处理数据时,要各自分开处理自己的)

public static int rank(int key, int[] a, int lo, int hi) {        if (lo > hi) return -1;        int mid = lo + (hi - lo) / 2;        if (key < a[mid]) return rank(key, a, lo, mid - 1);        else if (key > a[mid]) return rank(key, a, mid + 1, hi);        else return mid;    }

素数

算法有很多,暂时选择了算法书上的办法,网上还有很多其他的高效办法。

public static boolean isPrime(int N) {        if (N < 2) return false;        for (int i = 2; i * i <= N; i++)            if (N % i == 0) return false;        return true;    }

二进制表示十进制数字

java本身提供了Integer.toBinaryString(N)方法,还有下面的方法。

 public static String toBinaryString(int N) {        StringBuilder sb = new StringBuilder();        for (int n = N; n > 0; n /= 2)            sb.append(n % 2);        return sb.reverse().toString();    }

求最大公约数

public static int gcvd(int p, int q) {        if (q == 0) return p;        int r = p % q;        return gcvd(q, r);    }

费波纳奇数列

递归调用

 public static long F(int N) {        if (N == 0) return 0;        if (N == 1) return 1;        return F(N - 1) + F(N - 2);    }

普通调用

public static int f(int N) {        if (N == 0) return 0;        if (N == 1) return 1;        int a = 0;        int b = 1;        for (int i = 2; i <= N; i++) {            b = a + b;            a = b - a;        }        return b;    }
0 0
原创粉丝点击