• 用安卓实现斐波那契数和最近点对问题


    目录

    1 运行效果展示

    2 具体编码

    2.1 斐波那契数问题

    2.2 最近点对问题


    1 运行效果展示

     

    2 具体编码

    2.1 斐波那契数问题

    具体问题即解决方案请参考本人另一篇博客:算法笔记_001:斐波那契数的多种解法

    功能界面布局main_one.xml文件对应界面图:

    其源码:

    <?xml version="1.0" encoding="utf-8" ?>
    <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:rowCount="14"
        android:columnCount="3"
        android:id="@+id/root">
        <!-- 定义一个横跨4列的文本框,
        并设置该文本框的前景色、背景色等属性  -->
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:lines="8">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="false"
            android:marqueeRepeatLimit="marquee_forever"
            android:ellipsize="marquee"
            android:scrollHorizontally="true"
            android:layout_columnSpan="3"
    
            android:textSize="25sp"
            android:layout_marginLeft="2pt"
            android:layout_marginRight="2pt"
            android:padding="3pt"
            android:layout_gravity="right"
            android:background="#eee"
            android:textColor="#000"
            android:text="0"
            android:id="@+id/show_result" />
        </ScrollView>
        <!-- 定义一个横跨4列的按钮 -->
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_columnSpan="3"
            android:lines="2"
            android:hint="请输入相应数字"
            android:selectAllOnFocus="true"
            android:id="@+id/number" />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_columnSpan="3"
            android:textSize="32sp"
            android:text="清除"
            android:background="@android:color/holo_blue_light"
            android:backgroundTint="#ed5454"
            android:id="@+id/clean"
            android:onClick="one_clean"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_columnSpan="3"
            android:textSize="32sp"
            android:text="实验一题目介绍"
            android:background="@android:color/holo_blue_light"
            android:id="@+id/introduce"
            android:onClick="one_indrouce"/>
        <LinearLayout
            android:id="@+id/linearLayout4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingTop="5dip" >
            <LinearLayout
                android:id="@+id/linearLayout2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:paddingTop="5dip" >
    
                <Button
                    android:id="@+id/button_one"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="功能1"
                    android:textSize="32sp"
                    android:onClick="function_one"/>
    
                <Button
                    android:id="@+id/button_three"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="功能3"
                    android:textSize="32sp"
                    android:onClick="function_three"/>
            </LinearLayout>
    
            <LinearLayout
                android:id="@+id/linearLayout3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:paddingTop="5dip" >
    
                <Button
                    android:id="@+id/button_four"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="功能4"
                    android:textSize="32sp"
                    android:onClick="function_four"/>
    
                <Button
                    android:id="@+id/button_five"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="功能5"
                    android:textSize="32sp"
                    android:onClick="function_five"/>
    
                <Button
                    android:id="@+id/button_two"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="功能2"
                    android:textSize="32sp"
                    android:onClick="function_two"/>
    
                <Button
                    android:id="@+id/button_six"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:text="功能6"
                    android:textSize="32sp"
                    android:onClick="function_six"/>
            </LinearLayout>
        </LinearLayout>
    
    </GridLayout>

    main_one.xml文件对应MainActivity.java文件源码:

    package com.liu.zhen.algorithm;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Color;
    import android.net.Uri;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.GridLayout;
    import android.widget.TextView;
    
    
    public class MainActivity extends AppCompatActivity{
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_one);
        }
    
        //用迭代法寻找编程环境支持的最大整数(int型)的斐波那契数是第几个斐波那契数
        public static int max_int_iteration(){
            int a = 1,b = 1,c = 2;
            int count = 3;
            for( ;b < c; ){   //一旦c达到编程环境最大斐波那契数,便会产生内存溢出,从而变成一个负数,到此循环结束
                a = b;
                b = c;
                c = a + b;
                count++;
            }
            return count;
        }
    
        //用迭代法寻找编程环境支持的最大整数(long型)的斐波那契数是第几个斐波那契数
        public static long max_long_iteration() {
            long a = 1, b = 1, c = 2;
            long count = 3;
            for (; b < c; ) {    //一旦c达到编程环境最大斐波那契数,便会产生内存溢出,从而变成一个负数,到此循环结束
                a = b;
                b = c;
                c = a + b;
                count++;
            }
            return count;
        }
    
        //递归法
        public static int recursion(int n){
            int result = 0;   //最后一个斐波那契数及存储中间斐波那契数的变量
            if(n <= 0)
                result = 0;
            if(n == 1 || n == 2)
                result = 1;
            if(n > 2)
            {
                result = recursion(n-1) + recursion(n-2);
                //System.out.print(result+"  ");
            }
            return result;
        }
    
        //规定时间内,递归法计算出的最大斐波那契数是第几个
        public static int recursion_time(long time){
            long starttime_dg=System.currentTimeMillis();
            int i=3;
            long endtime_dg=0;
            while(endtime_dg<starttime_dg+time*1000){
                endtime_dg=System.currentTimeMillis();
                i++;
                recursion(i);
            }
            return i;
        }
    
        //迭代方法对斐波那契数列求解
        public static int iteration(int n){
            int a[]=new int[n+1];
            a[0]=0;a[1]=1;int result=0;
            if(n==1) return 1;
            for(int i=2;i<n+1;i++){
                a[i]=a[i-1]+a[i-2];
                result=a[n];
            }
            return result;
        }
    
        //规定时间内,迭代法计算出的最大斐波那契数是第几个
        public static int iteration_time(long time){
            long starttime_dg=System.currentTimeMillis();
            int i=3;
            long endtime_dg=0;
            while(endtime_dg<starttime_dg+time*1000){
                endtime_dg=System.currentTimeMillis();
                i++;
                iteration(i);
            }
            return i;
        }
    
        //直接求值法(利用公式F(n) = [@n/sqrt(5)]快速计算第n个斐波那契数)
        public static double formula(int n){
            double result = 0;
            double temp = Math.sqrt(5.0);
            result =  (1/temp)*(Math.pow((1+temp)/2,n)-Math.pow((1-temp)/2, n));
            return result;
        }
    
        //利用直接求值法,出现误差时最小的n值
        public static int min_formula(){
            double result_fn=1;
            int i=1;
            while(result_fn-(double)iteration(i)<1){
                result_fn=formula(i);
                i++;
            }
            return i;
        }
    
        // 关联矩阵
        private static final int[][] UNIT = { { 1, 1 }, { 1, 0 } };
        // 全0矩阵
        private static final int[][] ZERO = { { 0, 0 }, { 0, 0 } };
        /**
         * 求斐波那契数列
         *
         * @param n
         * @return
         */
        public static int[][] fb(int n) {
            if (n == 0) {
                return ZERO;
            }
            if (n == 1) {
                return UNIT;
            }
            // n是奇数
            if ((n & 1) == 0) {
                int[][] matrix = fb(n >> 1);
                return matrixMultiply(matrix, matrix);
            }
            // n是偶数
            int[][] matrix = fb((n - 1) >> 1);
            return matrixMultiply(matrixMultiply(matrix, matrix), UNIT);
        }
    
        /**
         * 矩阵相乘
         *
         * @param m
         *            r1*c1
         * @param n
         *            c1*c2
         * @return 新矩阵,r1*c2
         */
        public static int[][] matrixMultiply(int[][] m, int[][] n) {
            int rows = m.length;
            int cols = n[0].length;
            int[][] r = new int[rows][cols];
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    r[i][j] = 0;
                    for (int k = 0; k < m[i].length; k++) {
                        r[i][j] += m[i][k] * n[k][j];
                    }
                }
            }
            return r;
        }
    
        //具体实现矩阵相乘算法
        public static int matrix(int n){
            int[][] m = fb(n);
            return m[0][1];
        }
    
        //清除
        public void one_clean(View v) {
            String clean_text = "0";
            TextView show_text = (TextView) findViewById(R.id.show_result);
            show_text.setText(clean_text);
        }
    
        //题目介绍
        public void one_indrouce(View v) {
            Intent intent = new Intent();
            intent.setClass(MainActivity.this,MainOneActivity.class);
            startActivity(intent);
        }
    
        //功能1
        public void function_one(View v) {
            int a = max_int_iteration();
            long b = max_long_iteration();
            String function_one = "迭代法编程环境支持的最大整数(int型)值:" + a + "
    " + "迭代法编程环境支持的" +
                            "最大整数(long型)值:" + b;
            TextView show_text = (TextView) findViewById(R.id.show_result);
            show_text.setText(function_one);
        }
    
        //功能2
        public void function_two(View v){
            TextView show_text = (TextView) findViewById(R.id.show_result);
            String wait_two = "请耐心等待......";
            show_text.setText(wait_two);
    
            int a = 40;
            long starttime_dg=System.currentTimeMillis();
            recursion(a);
            long endtime_dg=System.currentTimeMillis();
            double time = (endtime_dg - starttime_dg)/1000.0;
            String time_two = "递归方式计算第"+a+"个斐波那契数(int型)耗时:"+time+"秒";
            show_text.setText(time_two);
           // EditText edit_text = (EditText) findViewById(R.id.number);
           // show_text.setText(time_two);
    
        }
    
        //功能3
        public void function_three(View v){
            EditText edit_text = (EditText) findViewById(R.id.number);
            int t = Integer.parseInt(edit_text.getText().toString());
            int a = recursion_time(t);
            int b = iteration_time(t);
            String three_function = "递归法在"+t+"秒内计算出的最大斐波那契数是第"+a+"个"+"
    "+"迭代法在"+t+"秒内" +
                    "计算出的最大斐波那契数是第"+b+"个";
            TextView show_text = (TextView) findViewById(R.id.show_result);
            show_text.setText(three_function);
        }
    
        //功能4
        public void function_four(View v){
            int a = min_formula();
            String four_function = "利用直接求值法,出现误差时最小的n值是:"+a;
            TextView show_text = (TextView) findViewById(R.id.show_result);
            show_text.setText(four_function);
        }
    
        //功能5
        public void function_five(View v){
            EditText edit_text = (EditText) findViewById(R.id.number);
            int t = Integer.parseInt(edit_text.getText().toString());
            int a = matrix(t);
            String five_function = "利用矩阵相乘法计算第"+t+"个斐波那契数的值是:"+a;
            TextView show_text = (TextView) findViewById(R.id.show_result);
            show_text.setText(five_function);
        }
    
        //功能6
        public void function_six(View v){
            EditText edit_text = (EditText) findViewById(R.id.number);
            int t = Integer.parseInt(edit_text.getText().toString());
            //迭代法计算耗时
            long starttime_iteration=System.currentTimeMillis();
            int a1 = iteration(t);
            long endtime_iteration=System.currentTimeMillis();
            double  time_iteration = (endtime_iteration-starttime_iteration)/1000.0;
           // long time_iteration = six_time_iteration(t);
            String b1 = "迭代法计算第"+t+"个斐波那契数耗时:"+time_iteration+"秒  计算结果是:"+a1;
    
            //递归法计算耗时
            long starttime_recursion=System.currentTimeMillis();
            int a2 = recursion(t);
            long endtime_recursion=System.currentTimeMillis();
            double time_recursion = (endtime_recursion-starttime_recursion)/1000.0;
            String b2 = "递归法计算第"+t+"个斐波那契数耗时:"+time_recursion+"秒  计算结果是:"+a2;
    
            //公式法计算耗时
            long starttime_formula=System.currentTimeMillis();
            double a3 = formula(t);
            long endtime_formula=System.currentTimeMillis();
            double time_formula = (endtime_formula-starttime_formula)/1000.0;
            String b3 = "公式法计算第"+t+"个斐波那契数耗时:"+time_formula+"秒  计算结果是:"+(int)a3;
    
            //矩阵相乘法计算耗时
            long starttime_matrix=System.currentTimeMillis();
            int a4 = matrix(t);
            long endtime_matrix=System.currentTimeMillis();
            double time_matrix = (endtime_matrix-starttime_matrix)/1000.0;
            String b4 = "矩阵相乘法计算第"+t+"个斐波那契数耗时:"+time_matrix+"秒  计算结果是:"+a4;
    
            String six_function = b1+"
    "+b2+"
    "+b3+"
    "+b4;
            TextView show_text = (TextView) findViewById(R.id.show_result);
            show_text.setText(six_function);
        }
    
    }

    2.2 最近点对问题

    具体问题即解决方案请参考本人另一篇博客:算法笔记_002:最近点对问题

    功能界面布局activity_maintwo.xml文件对应界面图:

    其源码:

    <?xml version="1.0" encoding="utf-8"?>
    <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:rowCount="17"
        android:columnCount="3"
        android:id="@+id/root">
        <!-- 定义一个横跨11列的文本框,
        并设置该文本框的前景色、背景色等属性  -->
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:singleLine="false"
                android:marqueeRepeatLimit="marquee_forever"
                android:ellipsize="marquee"
                android:scrollHorizontally="true"
                android:layout_columnSpan="3"
                android:lines="13"
                android:textSize="20sp"
                android:layout_marginLeft="2pt"
                android:layout_marginRight="2pt"
                android:padding="3pt"
                android:layout_gravity="right"
                android:background="#eee"
                android:textColor="#000"
                android:text="实验二题目及功能介绍:
        给定某空间中(直线空间或平面空间)n个点,请找出它们中的最近点对。
    (1)功能1:在输入框中输入一个数字x(最好在5—20之间),系统会随机生成x个直线上的点坐标(0—1000之间的随机数),并输出最近点对坐标和最短距离;
    (2)功能2:和功能1实现结果一致,不过是基于平面中的点(0-50之间的随机数)。"
                android:id="@+id/show_two" />
    
        <!-- 定义一个横跨2列的输入文本框 -->
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_columnSpan="3"
            android:lines="2"
            android:hint="请输入相应数字"
            android:selectAllOnFocus="true"
            android:id="@+id/number_two" />
        <!-- 定义一个两个功能键按钮 -->
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_columnSpan="3"
            android:textSize="32sp"
            android:text="功能1(直线空间)"
            android:background="@android:color/holo_blue_light"
            android:backgroundTint="#5484ed"
            android:id="@+id/function_line"
            android:onClick="function_line"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_columnSpan="3"
            android:textSize="32sp"
            android:text="功能2(平面空间)"
            android:background="@android:color/holo_blue_light"
            android:id="@+id/function_space"
            android:onClick="function_space"
            android:backgroundTint="@android:color/holo_orange_light" />
    
    </GridLayout>

    activity_maintwo.xml对应Main2Activity.java文件源码:

    package com.liu.zhen.algorithm;
    
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    
    public class Main2Activity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_maintwo);
        }
    
        //初始化一个随机数组
        public static int[] initializationArray(int n){
            int[] result = new int[n];
            for(int i = 0;i < n;i++)
                result[i] = (int)(Math.random()*1000); //采用随机函数随机生成0~1000之间的数
            return result;
    
        }
    
        //返回数组中最大值
        public static int getArrayMax(int a[] , int first , int end){
            int max = a[first];
            for(int i = first;i < end;i++){
                if(max < a[i])
                    max = a[i];
            }
            return max;
        }
    
        //返回数组中最小值
        public static int getArrayMin(int a[] , int first , int end){
            int min = a[first];
            for(int i = first;i < end;i++){
                if(min > a[i])
                    min = a[i];
            }
            return min;
        }
    
        //交换数组a[n]中两个数的值
        public static void swapArray(int a[] , int i , int j){
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    
        //采用分治法将数组a[n]分成两组,满足a[n1]<m,a[n2]>m(其中n1+n2 = n)
        public static int divideArray(int a[],int first,int end){
            int max = getArrayMax(a,first,end);
            int min = getArrayMin(a,first,end);
            double m = (max + min)/2.0;
            //System.out.println("分治法算出中位数m:"+m);
            int i = first , j = end-1;
            //int a1 = 0;
            for( ;i+1 <= j;){
                while(a[i] < m && i+1 <= j)
                    i++;
                while(a[j] > m && i+1 <= j)
                    j--;
                //  a1++;
                //    System.out.println("第"+a1+"此交换时a[i] = "+a[i]+" i = "+i+"  a[j] = "+a[j]+" j = "+j);
                swapArray(a,i,j);   //a[i]大于m的值与a[j]小于m的值进行交换,但数组的位置不变
            }
            //System.out.println("分组后,返回的序号j值是:"+(j));
            return j;
        }
    
        //采用递归法合并最短距离值,返回最短距离的点
        public static int[] getMinDistancePoint(int a[] , int result[],int n ,int first , int end) {
    
            if(end-first <= 1){   //递归终止条件
                return result;
            }
    
            int j = divideArray(a,first,end);
            int minDistance = result[1] - result[0];  //最短距离两点之间的距离大小
            if(minDistance > getArrayMin(a,j,end)-getArrayMax(a,first,j))
            {
                result[0] = getArrayMax(a,first,j);   //最短距离两点中数值最小的点
                result[1] = getArrayMin(a,j,end);   //最短距离两点中数值最小的点
            }
    
            int result_one[] = getMinDistancePoint(a,result,2,first,j);   //递归
    
            int minDistance_one = result_one[1] - result_one[0];
            int result_two[] = getMinDistancePoint(a,result,2,j,end);   //递归
    
            int minDistance_two = result_two[1] - result_two[0];
            if(minDistance > minDistance_one)
                result = result_one;
            if(minDistance > minDistance_two)
                result = result_two;
            return result;
        }
    
        //平面中求两点最短距离问题解法
    
        //初始化一个平面中n个点,具体点的坐标值随机生成
        public static Point[] initializationPlaneArray(int n){
            Point result[] = new Point[n];
            for(int i = 0;i < n;i++){
                int x1 = (int)(Math.random()*50); //采用随机函数随机生成1~100之间的数
                int y1 =  (int)(Math.random()*50);
                result[i] = new Point(x1,y1);
            }
            return result;
        }
    
        //迭代法直接求平面中两点之间的最短距离,返回最短距离的两点坐标
        public static Point[] getMinDistancePlanePoint(Point a[],int n){
            Point result[] = new Point[2];
            double min = 10000;    //定义两点之间最短距离变量,初始化为10000
            for(int i = 0;i < n;i++){
                int x = a[i].getX();
                int y = a[i].getY();
                for(int j = i+1;j < n;j++){
                    int x1 = a[j].getX();
                    int y1 = a[j].getY();
                    long minSquare = (x-x1)^2 + (y-y1)^2;   //利用数学中求两点之间距离公式,得到两点之间距离的平方
                    double min1 = Math.sqrt(minSquare);    //求两点之间距离的中间变量
                    if(min > min1){
                        min = min1;
                        result[0] = new Point(x,y);
                        result[1] = new Point(x1,y1);
                    }
                }
            }
    
            return result;
        }
    
        //功能1(直线空间)
        public void function_line(View v){
            EditText edit_text = (EditText) findViewById(R.id.number_two);
            int t = Integer.parseInt(edit_text.getText().toString());
            int a[] = new int[t];
            int b[] = new int[2];
            b[0] = 0;
            b[1] = 1000;
            a = initializationArray(t);
            String one_text = "";
            for(int i = 0;i < t;i++)
                one_text += "直线随机点Point["+i+"] = "+a[i]+"
    ";
            int result[] = getMinDistancePoint(a,b,2,0,t);
            one_text += "最短距离点对第1点result[0] = "+result[0]+"
    "+"最短距离点对第2点result[1] = "+result[1];
            //System.out.print(one_text);
            Intent intent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putString("str",one_text);
            intent.putExtras(bundle);
            intent.setClass(Main2Activity.this,TwoResultActivity.class);
            startActivity(intent);
        }
    
        //功能2(平面空间)
        public void function_space(View v){
            EditText edit_text = (EditText) findViewById(R.id.number_two);
            int t = Integer.parseInt(edit_text.getText().toString());
            String two_text = "";
            Point c[] = initializationPlaneArray(t);
            for(int i = 0;i < t;i++)
                two_text += "平面随机点Point["+i+"] = "+"("+c[i].getX()+","+c[i].getY()+")"+"
    ";
            Point back[] = getMinDistancePlanePoint(c,t);
            for(int i = 0;i < 2;i++)
                two_text +=  "距离最短的两点第"+(i+1)+"个点坐标是:"+"("+back[i].getX()+","+back[i].getY()+")"+"
    ";
            Intent intent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putString("str",two_text);
            intent.putExtras(bundle);
            intent.setClass(Main2Activity.this,TwoResultActivity.class);
            startActivity(intent);
        }
    }

    附本项目源码:

          https://coding.net/u/LiuZhen1995/p/MyDemo/git/tree/origin_six/

  • 相关阅读:
    Django框架(二)
    USACO 2019 December Contest 随记
    Codeforces 1249E By Elevator or Stairs? 题解
    NIKKEI Programming Contest 2019-2 D 部分分题解
    Codeforces 1196D2 RGB Substring (Hard version) 题解
    HDU5943 Kingdom of Obsession 题解
    智能账单统计软件开发日志3 图像比对算法
    Codeforces #536 A..D 题解
    智能账单统计软件开发日志2 图像形态优化
    智能账单统计软件开发日志1 立项与环境配置
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6159900.html
Copyright © 2020-2023  润新知