zoukankan      html  css  js  c++  java
  • (学习3)二分法与二叉查找树

    二分查找法:对一个有序序列进行一分为二的检索,每次查找范围缩小一半,直到找到所需的数或者查找范围不存在;

    问题描述:对一个有序序列检索一个输入的数,若该数存在则返回下标,否则返回1;

    问题分析:这种问题最简单的方法是顺序检索,在数据量小的情况下,顺序和二分还有二叉查找树没有很大差别(此时是单边树),但在数据量大的情况下,对有序表的检索二分较优。

    这里用二叉查找树只是因为想复习一下数据结构学过的知识。

    时间复杂度:log(n)

    算法设计:

    //
    //  binary_search.cpp
    //
    //
    //  Created by yizhihenpidehou on 2020/3/10.
    //
    
    #include <stdio.h>
    #include <iostream>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    const int maxen=500;
    int binary_search(int *num,int search_num,int len){ //二分查找法
        int left=1;
        int right=len;
        int mid;
        while(left<=right){
            mid=(left+right)/2;
            if(num[mid]==search_num){
                return mid;
            }
            else if(num[mid]<search_num){
                left=mid+1;
            }
            else{
                right=mid-1;
            }
        }
        return 0;
    }
    int main(){
        int n;//输入数的数量
        scanf("%d",&n);
        int j=0;
        int num[maxen];
        for(int i=1;i<=n;i++){
            scanf("%d",&num[i]);
        }
        int search_num;
        scanf("%d",&search_num);
        j=binary_search(num,search_num,n);
        printf("%d
    ",j);
        return 0;
    }

    2:二叉查找树(BST)

    算法时间复杂度:在单支树的情况下是O(n),在分布均匀的情况下是O(logn)

    算法设计

    //
    //  binary_search.cpp
    //  
    //
    //  Created by yizhihenpidehou on 2020/3/10.
    //
    
    #include <stdio.h>
    #include <iostream>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    const int maxen=500;
    int binary_search(int *num,int search_num,int len){
        int left=1;
        int right=len;
        int mid;
        while(left<=right){
            mid=(left+right)/2;
            if(num[mid]==search_num){
                return mid;
            }
            else if(num[mid]<search_num){
                left=mid+1;
            }
            else{
                right=mid-1;
            }
        }
        return j;
    }
    int main(){
        int n;//输入数的数量
        scanf("%d",&n);
        int j=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&num[i]);
        }
        int search_num;
        scanf("%d",&search_num);
        j=binary_search(num,search_num,n);
        printf("%d
    ",j);
        return 0;
    }

    github:https://github.com/yizhihenpidehou/bananas/tree/master/%E7%AC%AC%E4%B8%89%E5%91%A8 

  • 相关阅读:
    ARM六种寻址方式的汇编实现
    生产者消费者
    哲学家问题
    linux进程的问题
    linux信号量使用
    linux进程创建
    Ubuntu下编写C语言程序
    Android使用图表库简单教程
    不需要SDK调用图灵机器人的方法
    robotframework接口测试实例
  • 原文地址:https://www.cnblogs.com/pipihoudewo/p/12496095.html
Copyright © 2011-2022 走看看