八股文面试day1

news2024/12/28 3:54:48

二分查找(解决整数溢出)

方法一:mid=(left+right)/2 -> left/2+right/2 -> left+(-left/2+right/2) -> l+(r-l)/2

方法二:mid=(l+r)>>>1 字节溢出整体右移一位就是正确的值 

MySQL存储引擎MyISAM和InnoDB的区别

  1. 数据的存储结构不同MyISAM在磁盘上存储有3个文件,它们是以表的名字开头来命名的 .frm文件:存储表定义 MYD文件:存储数据文件 MYI文件:存储索引文件)(InnoDB在磁盘上存储有2个文件 .frm文件:存储表结构  .ibd文件:存储数据和索引文件)由于MyISAM的索引和数据是分开存储的,因此在索引查找的时候,MyISAM的叶子结点存储的是数据所在的地址,而不是数据;而InnoDB的叶子结点存储的是整个数据行所有的数据
  2. 存储空间的消耗不同(MyISAM可能会被压缩,存储空间也比较小,它支持三种存储格式:静态表、动态表和压缩表,而InnoDB是需要更多的内存和存储,它会在主内存中建立它专有的缓冲池,用来去高速缓冲数据和索引,所以InnoDB所在的表都保存在同一个数据文件中 InnoDB的表大小只受限于操作系统的文件大小 一般是2个GB )
  3. 对事务的支持不同(MyISAM强调的是性能,每次查询都具有原子性,它的执行速度比InnoDB要更快一些,但是不支持事务操作,而InnoDB除了事务支持外,还支持外键等这样一些高级数据库的功能还具备事务提交事务回滚和崩溃修复能力,这样的一些事务安全的类型的表)
  4. 对锁的支持不同(那如果是执行大量的查询,MyISAM应该是更好的选择,而MyISAM的增删改的时候,需要去锁定整个表格,所以它的效率会更低,而InnoDB它是支持行级锁,在删除插入的时候,只需要锁定操作行就可以,那如果有大量的插入、修改和删除的时候,使用InnoDB它的性能会更高一些)
  5. 对外键的支持不同(MyISAM不支持外键,而InnoDB是支持外键的,不同的MySQL版本,对两者的支持都有所改进的)

常见的排序算法

冒泡排序 

冒泡排序常规版优化方法bubble(减少比较次数+冒泡次数)重点加上标志

冒泡排序终极版优化方法bubble1记录最后一次交换位置(减少比较次数+冒泡次数

文字描述:依次比较数组中相邻两个元素大小 若a[j]>a[j+1] 则交换两个元素 两两比较一遍称为一轮冒泡,结果是让最大的元素排到最后 

package com.huhu.sort;

import java.util.Arrays;

public class BubbleSort2 {
    public static void main(String[] args) {
        int[] a={5,2,7,4,1,3,8,9};
        bubble2(a);
    }

    public static void bubble(int[] a){
        for (int j = 0; j < a.length - 1; j++) {
            // 一轮冒泡
            boolean swapped=false;//默认没有交换
            // 优化二:减少冒泡次数(判断是否交换)
            // 优化一:减少比较次数 -j
            for (int i = 0; i < a.length - 1 - j; i++) {
                System.out.println("比较次数:"+(i+1));
                if (a[i]>a[i+1]){
                    swap(a,i,i+1);
                    swapped=true;
                }
            }
            System.out.println("第"+(j+1)+"轮冒泡:"+ Arrays.toString(a));
            if (!swapped) {
                break;
            }
        }
    }

    public static void bubble2(int[] a){
        int n=a.length-1;
        while (true){
            int last=0;//记录最后一次交换的位置
            for (int i=0;i<n;i++){
                System.out.println("比较次数:"+(i+1));
                if (a[i]>a[i+1]){
                    swap(a,i,i+1);
                    last=i;
                }
            }
            n=last;
            System.out.println("第轮冒泡:"+ Arrays.toString(a));
            if (n==0){
                break;
            }
        }
    }

    public static void swap(int[] a,int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}

选择排序

将数组分为两个子集,排序和未排序的,每一轮从未排序的子集中选出最小的元素,放入排序子集,重复以上步骤,直到整个数组有序(循环查找最小元素索引位置 交换

package com.huhu.sort;

import java.util.Arrays;

//理论上的选择排序法
public class SelectSort2 {
    public static void main(String[] args) {
        int[] arr = {101, 34, 119, 60};
        System.out.println("排序前的数组");
        System.out.println(Arrays.toString(arr));
        selectSort(arr);
    }

    private static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            // i代表每轮选择最小元素要交换到的目标索引
            int s=i; //最小元素的索引
            for (int j = s + 1; j < arr.length; j++) {
                if (a[s] > arr[j]) {
                    s=j;
                }
            }
            if (s != i) {
                swap(a,s,i);
            }
            System.out.println("第" + (i + 1) + "轮排序后数组");
            System.out.println(Arrays.toString(arr));
        }
    }

    public static void swap(int[] a,int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}

选择排序与冒泡排序比较

  1. 二者平均时间复杂度都是O(n2)
  2. 选择排序一般要快于冒泡,因为其交换次数少
  3. 但如果集合有序度高,冒泡优选O(n)
  4. 冒泡稳定选择不稳定

插入排序 

将数组分为两个区域,排序和未排序的,每一轮从未排序的区域中取出第一个元素,插入到排序区域,重复以上步骤,直到整个数组有序

package com.huhu.sort;

import java.util.Arrays;

public class InsertSort2 {
    public static void main(String[] args) {
        int[] a = {9,3,7,2,5,8,1,4};
        insert(a);
    }

    private static void insert(int[] a) {
        // i代表待插入元素的索引
        for (int i = 1; i < a.length; i++) {
            int t = a[i];//t代表待插入元素的值
            int j = i - 1;//代表已排序数组的索引
            while (j >= 0) {
                if (t < a[j]) {
                    a[j + 1] = a[j];
                } else {
                    break;
                }
                j--;
            }
            a[j + 1] = t;
            System.out.println(Arrays.toString(a));
        }
    }
}

 插入排序与选择排序比较

  1. 二者平均时间复杂度都是O(n2)
  2. 大部分情况下,插入优于选择
  3. 有序集合插入时间复杂度O(n)
  4. 插入属于稳定排序算法,而选择属于不稳定

快速排序

时间复杂度O(nlogn) 最坏O(n) 使用于数据量大 不稳定排序

单边快排 

package com.huhu.sort;

import java.util.Arrays;

public class QuickSort1 {
    public static void main(String[] args) {
        int[] a={5,3,7,2,9,8,1,4};
        quick(a,0,a.length-1);
    }

    public static void quick(int[] a,int l,int h){
        if (l>=h){
            return;
        }
        int p=partition(a,l,h);
        quick(a,l,p-1);
        quick(a,p+1,h);
    }


    public static int partition(int[] a,int l,int h){
        int pv=a[h];//最右为基准元素
        int i=l;
        for (int j = l; j < h; j++) {
            if (a[j]<pv){//比基准小就交换i j元素
                if (i!=j){
                    swap(a,i,j);
                }
                i++;
            }
        }
        if (i!=h){
            swap(a,h,i);
        }
        System.out.println(Arrays.toString(a)+" i="+i);
        return i;//返回值代表基准点元素的正确索引
    }

    public static void swap(int[] a,int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}

双边快排(从右往左找小的 从左往右找大的

package com.huhu.sort;

import java.util.Arrays;

public class QuickSort1 {
    public static void main(String[] args) {
        int[] a={5,3,7,2,9,8,1,4};
        quick(a,0,a.length-1);
    }

    public static void quick(int[] a,int l,int h){
        if (l>=h){
            return;
        }
        int p=partition(a,l,h);
        quick(a,l,p-1);
        quick(a,p+1,h);
    }
    
    public static int partition(int[] a,int l,int h){
        int pv=a[l];
        int i=l;
        int j=h;
        while (i<j){
            while (i<j&&a[j]>pv){
                j--;
            }
            while (i<j&&a[i]<=pv){//加上等于保证基准元素不会被交换
                i++;
            }
            swap(a,i,j);
        }
        swap(a,l,j);
        System.out.println(Arrays.toString(a)+" j="+j);
        return j;//返回值代表基准点元素的正确索引
    }

    public static void swap(int[] a,int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Raspberry Pi GPIO入门指南

如果您想使用 Raspberry Pi 进行数字输入/输出操作&#xff0c;那么您需要使用 GPIO&#xff08;通用输入/输出&#xff09;引脚。在这篇文章中&#xff0c;我们将为您提供 Raspberry Pi GPIO 的基础知识&#xff0c;包括如何访问和操作 GPIO 引脚。 0.认识GPIO 树莓派上的那…

MMSeg绘制模型指定层的Heatmap热力图

文章首发及后续更新&#xff1a;https://mwhls.top/4475.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; 摘要&#xff1a;绘制模型指定层的热力图 可视化环境安装 …

matlab - 程序流程控制、函数文件、特殊函数、调试与优化

学习视频MATLAB代码的两种执行方式&#xff1a;命令行、程序执行。1.程序流程控制1.1.m文件matlab中m文件分为两种&#xff1a;脚本文件&函数文件。脚本文件&#xff1a;实际上是一个命令的集合&#xff0c;可认为是命令行的改良版&#xff0c;方便我们去编写命令函数文件&…

守护进程 || 精灵进程

目录 守护进程&#xff08;deamon&#xff09; || 精灵进程 特点 什么是前台进程组 把自己写的服务器deamon deamon代码 守护进程&#xff08;deamon&#xff09; || 精灵进程 特点 01. 他的PPID是1&#xff08;附件特征&#xff09;02. COMMAND --- 称为进程启动的命令03…

[ vulnhub靶机通关篇 ] Empire Breakout 通关详解

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

应用层协议 HTTP HTTPS

目录 应用层 再谈 "协议" 序列化和反序列化 关于 json库 request序列化 request反序列化 response序列化 response反序列化 PS&#xff1a;命令宏 HTTP协议 认识URL urlencode和urldecode HTTP协议格式 HTTP请求 HTTP响应 请求方法 ​编辑 HT…

使用Element-UI展示数据(动态查询)

学习内容来源&#xff1a;视频P4 本篇文章进度接着之前的文章进行续写 精简前后端分离项目搭建 Vue基础容器使用 目录选择组件修改表格组件修改分页组件增加后端接口前端请求数据接口页面初始化请求数据点击页码请求数据选择组件 在官方文档中选择现成的组件&#xff0c;放在页…

XSS漏洞分类

XSS漏洞分类XSS分类反射型XSS反射XSS案例存储型XSS存储型XSS实操XSS分类 XSS根据类型和利用手法的不同&#xff0c;主要分为三大类&#xff1a; 反射型XSS存储型XSSDOM型XSS 反射型XSS 反射型XSS又称为非持久型XSS&#xff0c;是现在最容易出现的一种XSS漏洞。用户在请求某…

零死角玩转stm32初级篇4-初识 STM32 库

本篇博文目录:一.STM32库开发的相关概念知识1.什么是 STM32 库&#xff1f;2.CMSIS 标准二.STM32 结构及库层次关系1.库目录&#xff0c;文件简介2.CMSIS3.STM32F10x_StdPeriph_Driver4.STM32F10x_StdPeriph_Template5.库各文件间的关系三.使用库帮助文档1.常用官方资料2.官网手…

Math类详解与Random类、三种随机数生成方式(java)

文章目录&#x1f4d6;前言&#xff1a;&#x1f380;认识Random类&#x1f380;三种随机数生成方式&#x1f380;Math类的用途&#x1f380;Math类的方法&#x1f4d6;前言&#xff1a; 本篇博客主要以介绍Math类的常用方法及认识Random类&#xff0c;及三种随机数生成方式 …

Docker学习(二十)什么是分层存储?

目录1.简介2.什么是 Union Mount&#xff1f;3.分层介绍1&#xff09;lowerdir 层&#xff08;镜像层&#xff09;2&#xff09;upperdir 层&#xff08;容器层&#xff09;3&#xff09;merged 层4.工作原理1&#xff09;读&#xff1a;2&#xff09;写&#xff1a;3&#xff…

Java位集合之BitMap,BitSet解析

文章目录1 Java位集合1.1 Bit-Map1.1.1 简介1.1.2 添加1.1.3 清除1.1.4 查找1.2 Bitmap应用1.2.1 快速排序1.2.2 快速去重1.2.3 快速查找1.3 BitSet1.4 Bloom Filters1.4.1 简介1.4.2 BloomFilter 流程1 Java位集合 前几天刚学习了Redis中位操作命令&#xff0c;今天顺便学下j…

【unity】rts engine 6 放置并建造建筑;

一 放置并建造建筑 GameManager -> Essential -> BuildingExtension 查看 building placement building position y offset Y轴偏移&#xff0c;建筑离地距离&#xff0c;可0.1 terrain max distance 放置建筑与允许地形的最大距离&#xff0c;可1 placable terrain …

linux基本指令和权限

目录 一.shell命令以及运行原理 二.Linux常用指令 1. ls 指令 2. pwd命令 3.cd指令 4. touch指令 5.mkdir指令&#xff08;重要&#xff09; 6.rmdir指令 && rm 指令&#xff08;重要&#xff09; 7.man指令&#xff08;重要&#xff09; 8.cp指令&#xff08;重要&…

AI_Papers周刊:第四期

2023.02.28—2023.03.05 Top Papers Subjects: cs.CL 1.Language Is Not All You Need: Aligning Perception with Language Models 标题&#xff1a;KOSMOS-1&#xff1a;语言不是你所需要的全部&#xff1a;将感知与语言模型相结合 作者&#xff1a;Shaohan Huang, Li …

[C++]vector模拟实现

目录 前言&#xff1a; 1. vector结构 2. 默认成员函数 2.1 构造函数 无参构造&#xff1a; 有参构造&#xff1a; 有参构造重载&#xff1a; 2.2 赋值运算符重载、拷贝构造&#xff08;难点&#xff09; 2.3 析构函数&#xff1a; 3. 扩容 3.1 reserve 3.2 resize…

Matlab小波去噪——基于wden函数的去噪分析

文章目录一、问题描述二、代码问题1&#xff1a;原始信号加6分贝高斯白噪声问题2&#xff1a;确定合适的小波基函数问题3&#xff1a;确定最合适的阈值计算估计方法问题4&#xff1a;确定合适的分解层数问题5&#xff1a;实际信号去噪问题6&#xff1a;对比三、演示视频最后一、…

团队死气沉沉?10种玩法激活你的项目团队拥有超强凝聚力

作为项目经理和PMO&#xff0c;以及管理者最头疼的是团队的氛围和凝聚力&#xff0c;经常会发现团队死气沉沉&#xff0c;默不作声&#xff0c;你想尽办法也不能激活团队&#xff0c;也很难凝聚团队。这样的项目团队你很难带领大家去打胜仗&#xff0c;攻克堡垒。但是如何才能避…

Python|贪心|数组|二分查找|贪心|数学|树|二叉搜索树|在排序数组中查找元素的第一个和最后一个位置|计数质数 |将有序数组转换为二叉搜索树

1、在排序数组中查找元素的第一个和最后一个位置&#xff08;数组&#xff0c;二分查找&#xff09; 给定一个按照升序排列的整数数组 nums&#xff0c;和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 […

第十四届蓝桥杯三月真题刷题训练——第 2 天

目录 题目1&#xff1a;奇数倍数 代码: 题目2&#xff1a;求值 代码: 题目3&#xff1a;求和 代码: 题目4&#xff1a;数位排序 代码: 题目1&#xff1a;奇数倍数 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即…