首页 > 编程语言 >算法与数据结构(开篇)

算法与数据结构(开篇)

时间:2024-01-06 18:01:00浏览次数:39  
标签:arr 开篇 int 复杂度 算法 查找 key 数据结构

基本概念:

算法(Algorithm):⼀个计算过程,解决问题的⽅法

Niklaus Wirth: “程序=数据结构+算法”

时间复杂度

时间复杂度:⽤来评估算法运⾏效率的⼀个式⼦

经验

当算法过程出现循环折半的时候, 复杂度式⼦中会出现logn.

时间复杂度是⽤来估计算法运⾏时间的⼀个式⼦(单位)

常⻅的时间复杂度(按效率排序) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)

复杂问题的时间复杂度 O(n!) O(2n) O(nn)

如何简单快速地判断算法复杂度

快速判断算法复杂度(适⽤于绝⼤多数简单情况)

确定问题规模n

循环减半过程→logn

k层关于n的循环→n^k

空间复杂度

空间复杂度:⽤来评估算法内存占⽤⼤⼩的式⼦

空间复杂度的表示⽅式与时间复杂度完全⼀样

算法使⽤了⼏个变量:O(1)

算法使⽤了⻓度为n的⼀维列表:O(n)

算法使⽤了m⾏n列的⼆维列表:O(mn)

查找

查找:在⼀些数据元素中,通过⼀定的⽅法找出与给定关键字相同的数据 元素的过程。

列表查找(线性表查找):从列表中查找指定元素

输⼊:列表、待查找元素

输出:元素下标(未找到元素时⼀般返回None或-1)


顺序查找 (Linear Search)

顺序查找:也叫线性查找,从列表第⼀个元素开始,顺序进 ⾏搜索,直到找到元素或搜索到列表最后⼀个元素为⽌。

时间复杂度:O(n)

代码

#include "stdio.h"

int FindNumber(int pInt[6], int n, int key);

//顺序查找
int main(){
    //定义一个数组
    int arr[] = {4, 5,  6, 8, 11, 1};
    //n为长度
    int n = sizeof (arr) / sizeof (arr[0]);
    int key;
    printf("Input what you want to look for:\n");
    scanf("%d", &key);
    int result = FindNumber(arr, n, key);
    if(result != 0){
        printf("found,position is %d", (result + 1));
    } else{
        printf("not found!");
    }
    return 0;
}

//逐个比较
int FindNumber(int arr[6], int n, int key){
    int i = 0;
    for(i = 0; i < n; i++){
        if(arr[i] == key){
            return i;
        }
    }
    return 0;
}

二分查找:

⼆分查找:⼜叫折半查找,从有序列表的初始候选区中间开

始,通过对待查找的值与候选区中间值的⽐较,可以使候选

区减少⼀半

算法与数据结构(开篇)_顺序查找

#include "stdio.h"
int bin_search(int arr[], int length, int key){
    int low = 0, high = length;
    while (low <= high){
        int mid = (low + high) / 2;
        if(arr[mid] == key){
            printf("found!");
            return mid;
        } else if(arr[mid] < key){
            //大了往右
            low = mid + 1;
        } else{
            //小了往左
            high = mid - 1;
        }
    }
    return -1;
}


int main(){
    int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
    int length = sizeof (arr) / sizeof (arr[0]);
    int key, res;
    printf("input the key_number:\n");
    scanf("%d", &key);
    res = bin_search(arr, length, key);
    if(res == -1){
        printf("not found");
    } else{
        printf(" the %d is found", key);
    }
    return 0;
}

标签:arr,开篇,int,复杂度,算法,查找,key,数据结构
From: https://blog.51cto.com/u_16172166/9127370

相关文章

  • 排序算法之堆排序
    一:概述堆排序是在二叉堆的基础上实现的,如果想要学习堆排序,就得掌握二叉堆。二叉堆的特性是:最大堆的堆顶是整个堆中最大的元素。最小堆的堆顶是整个堆中最小的元素。二:具体说明<1>以最大堆为例讲述如果要删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我......
  • 算法的时间复杂度和空间复杂度
    1.算法效率1.1如何衡量一个算法的好坏longlongFib(intN){if(N<3){return1;}returnFib(N-1)+Fib(N-2);}斐波那契数列的递归实现方式非常简洁,但是简洁一定好吗?那应该如何衡量其好与坏呢?1.2算法的复杂度衡量一个算法的好坏,一般是从时间和空间上来衡量的,即时间......
  • 经典算法问题之打印日期
    这也是一道经典的算法题。其实也是用两个数组。还有判断是否闰年。两个个循环,外面一个是月份循环,内部一个是每个月的天数循环,然后计数器Count++就行,直到和天数相同就跳出循环,打印就行。#include<stdio.h>intjudge(intyear){if(year%400==0||year%100!=......
  • 机器学习-决策树系列-Adaboost算法-集成学习-29
    目录1.adaboost算法的基本思想2.具体实现1.adaboost算法的基本思想集成学习是将多个弱模型集成在一起变成一个强模型提高模型的准确率,一般有如下两种:bagging:不同的basemodel可以并行计算,输出预测结果少数服从多数,回归问题则对多个模型输出的结果求平均。boosting:后一......
  • 代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合
    一、回溯算法理论基础学习:1.基本概念回溯法是一种搜索方式回溯的本质是穷举,是递归的副产品,即回溯算法就是递归算法回溯解决的问题都能理解成树形结构,一般是在集合中递归查找子集。集合的大小构成树的宽度(n叉树),递归的深度构成了树的深度2.回溯解决的问题(1)组合问题:N个......
  • 经典算法之天数问题
    这题算是非常经典的题目了。无非就是判断闰年然后计算天数而已。用两个month数组记录月份天数一三五七八十腊是31天,二月份非闰年28天,闰年29天,其余都是30天就好了。#include<stdio.h>intjudge(intyear){if(year%400==0||year%100!=0&&year%4==0......
  • C语言逆波兰式算法
    1#include<stdio.h>23//数字模式识别4#defineIS_NUM(c)(((c)>='0')&&((c)<='9')||((c)=='.'))5//符号字符识别6#defineIS_OPERATOR(c)(((c)=='+')||((c)=='-')||((c)==&......
  • 2024年小红书最新x-s-common签名算法分析以及点赞api接口测试nodejs(2024-01-05)
      2024年小红书又更新了x-s-common算法,现在的版本是:3.6.8。这个签名算法现在是越来越重要了,许多接口都要用到。比如:评论,点赞等接口,没有这个算法采集不到数据。  一、chrome逆向x-s-common算法  1、x-s-common  打开chrome,按f12,打开开发者模式,随便找一接口,全局......
  • 经典算法之图形问题
    图形问题的万金解决方法就是创建一个二维数组,然后将填数组,最后打印数组就行了。其本质还是找出图形的规律。首先来找规律,先从外形上来找。奇数高,看图形,是上下左右对称的。所以只找上半区的规律。然后首行比其他行少两个字符也就是多两个空格,最外层都是A,数组可以提前都赋值。只......
  • 严蔚敏《数据结构》存储结构
    目录1.单链表2.双向链表3.带头结点的链表4.顺序栈5.单链队列6.循环队列7.广义表头尾链表存储8.广义表的扩展线性链表存储9.二叉树二叉链表存储表示10.树的双亲表示法11.树的孩子链表存储表示(孩子表示法)12.树的孩子兄弟表示法(二叉树表示法)13.二叉树的二叉线索存储......