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

Posted 舞动的心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用安卓实现斐波那契数和最近点对问题相关的知识,希望对你有一定的参考价值。

目录

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 + "\\n" + "迭代法编程环境支持的" +
                        "最大整数(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+"个"+"\\n"+"迭代法在"+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+"\\n"+b2+"\\n"+b3+"\\n"+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    给定某空间中(直线空间或平面空间)n个点,请找出它们中的最近点对。\\n(1)功能1:在输入框中输入一个数字x(最好在5—20之间),系统会随机生成x个直线上的点坐标(0—1000之间的随机数),并输出最近点对坐标和最短距离;\\n(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)

以上是关于用安卓实现斐波那契数和最近点对问题的主要内容,如果未能解决你的问题,请参考以下文章

[算法学习]斐波那契数计算

leetCode第509题——斐波那契数

求斐波那契数的python语言实现---递归和迭代

介绍下斐波那契数列。

php 两种方式实现求 斐波那契数

面试题10:斐波那契数列