Java面试干货:关于数组查找的几个常用实现算法

news2025/7/7 23:22:45

查找算法在我们的面试和开发中,是很常见的一种算法,今天我就给大家介绍几个常用的查找算法。

一. 线性查找

1.概念

线性查找也叫顺序查找,这是最基本的一种查找方法。该算法是从给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需的元素为止。在线下查找中,元素序列的排列可以有序,也可以无序。

2.代码实现

public class Test01 {
        public static void main(String[] args) {
                //线性查找
                
                int[] arr = {45, 62, 15,62, 78, 30};
                
                int index = sequentialSearch01(arr, 62);
                System.out.println("指定元素首次出现的下标位置:" + index);
                
                List<Integer> indexList = sequentialSearch02(arr, 62);
                System.out.println("指定元素出现的下标位置的集合:" + Arrays.toString(indexList.toArray()));
        }
        
        /**
         * 顺序查找
         * 返回指定元素首次出现的下标位置
         */
        public static int sequentialSearch01(int[] arr,int value){
                for (int i = 0; i < arr.length; i++) {
                        if(arr[i] == value){
                                return i;
                        }
                }
                return -1;
        }
        
        /**
         * 顺序查找
         * 返回指定元素出现的下标位置的集合
         */
        public static List<Integer> sequentialSearch02(int[] arr,int value){
                List<Integer> list = new ArrayList<>();
                for (int i = 0; i < arr.length; i++) {
                        if(arr[i] == value){
                                list.adds(i);
                        }
                }
                return list;
        }
}

二. 二分法查找

1.概念

二分查找(Binary Search)算法,也叫折半查找算法。当要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法。二分查找是针对有序数据集合的查找算法,如果是无序数据集合就遍历查找。

二分查找之所以快速,是因为它在匹配不成功的时候,每次都能排除剩余元素中一半的元素。因此可能包含目标元素的有效范围就收缩得很快,而不像顺序查找那样,每次仅能排除一个元素。

2.原理

比如有一个有序表数组[1,3,5,7,9,11,13,15,17,19,21],它是按照从小到大的顺序来进行排列的,现在需要在该有序表中查找元素19,步骤如下:

1.首先设置两个指针low和high,分别指向数据集合的第一个数据元素1(位序为0)和最后一个数据元素21(位序为10)。

2.然后把整个数据集合长度分成两半,并用一个指针指向它们的临界点,所以定义指针mid指向了中间元素11(位序5),也就是说mid=(high+low)/2,其中high和low都代表所指向的元素的位序,如下图:

3.接着,将mid所指向的元素(11)与待查找元素(19)进行比较。因为19大于11,说明待查找的元素(19)一定位于mid和high之间。所以继续折半,则low = mid+1,而mid = (low+high)/2,结果如下图:

4.接着,又将mid所指向的元素(17)与待查找元素(19)进行比较,由于19大于17,所以继续折半,则low = mid+1,而mid = (low+high)/2,结果如下图:

5.最后,又将mid所指向的元素(19)与待查找元素(19)进行比较,结果相等,则查找成功,返回mid指针指向的元素的位序。

如果查找的元素值不是19,而是20,那么在最后一步之前还得继续折半查找,最后出现的情况如下图:

3.代码实现

public class Test01 {
        public static void main(String[] args) {
                //二分法查找

                int[] arr = {1,2,3,4,5,6,7,8,9,11,11,11,11,11,11};

                int index = binarySearch01(arr, 11);
                System.out.println("指定元素出现的下标位置:" + index);

                List<Integer> indexList = binarySearch02(arr, 11);
                System.out.println("指定元素出现的下标位置的集合:" + Arrays.toString(indexList.toArray()));

                index = recursionbinarySearch01(arr, 0, arr.length-1, 11);
                System.out.println("递归方式 - 指定元素出现的下标位置:" + index);

                indexList = recursionbinarySearch02(arr, 0, arr.length-1, 11);
                System.out.println("递归方式 - 指定元素出现的下标位置的集合:" + Arrays.toString(indexList.toArray()));
        }

        /**
         * 有序的数组中查找某个元素出现的下标位置
         * 不使用递归的二分查找
         * 返回出现的下标位置
         */
        public static int binarySearch01(int[] arr,int val){

                int low = 0;
                int high = arr.length-1;

                while(low <= high){
                        int mid = (low + high)/2;

                        if(val > arr[mid]){
                                //目标在右侧
                                low = mid+1;
                        }else if(val < arr[mid]){
                                //目标在左侧
                                high = mid-1;
                        }else{
                                return mid;
                        }
                }
                return -1;
        }

        /**
         * 有序的数组中查找某个元素首次出现的下标位置
         * 不使用递归的二分查找
         * 返回下标集合
         */
        public static List<Integer> binarySearch02(int[] arr,int val){

                int low = 0;
                int high = arr.length-1;

                while(low <= high){
                        int mid = (low + high)/2;

                        if(val > arr[mid]){
                                //目标在右侧
                                low = mid+1;
                        }else if(val < arr[mid]){
                                //目标在左侧
                                high = mid-1;
                        }else{
                                // 定义放置索引下标的集合
                                List<Integer> list = new ArrayList<>();
                                // 将首次查找的位置放入集合
                                list.add(mid);

                                // 判断是否还有重复值
                                int index = mid + 1;
                                while(index < arr.length){
                                        if(arr[index] == val){
                                                list.add(index);
                                        }else{
                                                break;
                                        }
                                        index++;
                                }
                                index = mid-1;
                                while(index >= 0){
                                        if(arr[index] == val){
                                                list.add(index);
                                        }else{
                                                break;
                                        }
                                        index--;
                                }
                                return list;
                        }
                }
                return null;
        }

        /**
         * 有序的数组中查找某个元素出现的下标位置
         * 使用递归的二分查找
         * 返回出现的下标位置
         */
        public static int recursionbinarySearch01(int[] arr,int low,int high,int val){

                if(val < arr[low] || val > arr[high] || low > high){
                        return -1;
                }

                int mid = (low + high)/2;

                if(val > arr[mid]){
                        //目标在右侧
                        return recursionbinarySearch01(arr, mid+1, high, val);
                }else if(val < arr[mid]){
                        //目标在左侧
                        return recursionbinarySearch01(arr, low, mid-1, val);
                }else{
                        return mid;
                }
        }
        
        /**
         * 有序的数组中查找某个元素首次出现的下标位置
         * 使用递归的二分查找
         * 返回下标集合
         */
        public static List<Integer> recursionbinarySearch02(int[] arr,int low,int high,int val){

                if(val < arr[low] || val > arr[high] || low > high){
                        return null;
                }

                int mid = (low + high)/2;

                if(val > arr[mid]){
                        //目标在右侧
                        return recursionbinarySearch02(arr, mid+1, high, val);
                }else if(val < arr[mid]){
                        //目标在左侧
                        return recursionbinarySearch02(arr, low, mid-1, val);
                }else{
                        // 定义放置索引下标的集合
                        List<Integer> list = new ArrayList<>();
                        // 将首次查找的位置放入集合
                        list.add(mid);

                        // 判断是否还有重复值
                        int index = mid + 1;
                        while(index < arr.length){
                                if(arr[index] == val){
                                        list.add(index);
                                }else{
                                        break;
                                }
                                index++;
                        }
            
                        index = mid-1;
                        while(index >= 0){
                                if(arr[index] == val){
                                        list.add(index);
                                }else{
                                        break;
                                }
                                index--;
                        }
                        return list;
                }
        }
}

4.优缺点

优点:速度快,不占空间,不开辟新空间缺点:必须是有序的数组,数据量太小没有意义

三. 插值查找

1.概念

从折半查找中可以看出,折半查找的查找效率还是不错的。可是为什么要折半呢?为什么不是四分之一、八分之一呢?

举个例子,如果我们要在英语词典中查找“hello”这个单词,会首先翻开字典的中间部分,然后继续折半吗?肯定不会,对于查找单词“hello”,我们肯定是下意识的往字典的最前部分翻去,而查找单词“zero”则相反,我们会下意识的往字典的最后部分翻去。

所以在折半查找法的基础上进行改造就出现了插值查找法,也叫做按比例查找。所以插值查找与折半查找唯一不同的是在于mid的计算方式上,它的计算方式为:

int mid = low + (high - low) * (val- arr[low]) / (arr[high] - arr[low])

这样就能快速定位目标数值所在的索引,比二分查找可以更快速实现查找。

自适应获取mid,也就是自适应查找点。

2.代码实现

public class Test01 {
        public static void main(String[] args) {
                //插值查找
                
                int[] arr = {1,2,3,4,5,6,7,8,9,11,11,11,11,11,11};

                int index = insertSearch01(arr, 11);
                System.out.println("指定元素出现的下标位置:" + index);

                List<Integer> indexList = insertSearch02(arr, 11);
                System.out.println("指定元素出现的下标位置的集合:" + Arrays.toString(indexList.toArray()));

                index = recursionInsertSearch01(arr, 0, arr.length-1, 11);
                System.out.println("递归方式 - 指定元素出现的下标位置:" + index);

                indexList = recursionInsertSearch02(arr, 0, arr.length-1, 11);
                System.out.println("递归方式 - 指定元素出现的下标位置的集合:" + Arrays.toString(indexList.toArray()));
        }

        /**
         * 有序的数组中查找某个元素出现的下标位置
         * 不使用递归的二分查找
         * 返回出现的下标位置
         */
        public static int insertSearch01(int[] arr,int val){

                int low = 0;
                int high = arr.length-1;

                while(low <= high){
                        
                        int mid = low + (high - low) * (val - arr[low])/(arr[high] - arr[low]);

                        if(val > arr[mid]){
                                //目标在右侧
                                low = mid+1;
                        }else if(val < arr[mid]){
                                //目标在左侧
                                high = mid-1;
                        }else{
                                return mid;
                        }
                }
                return -1;
        }

        /**
         * 有序的数组中查找某个元素首次出现的下标位置
         * 不使用递归的二分查找
         * 返回下标集合
         */
        public static List<Integer> insertSearch02(int[] arr,int val){

                int low = 0;
                int high = arr.length-1;

                while(low <= high){
                        int mid = low + (high - low) * (val - arr[low])/(arr[high] - arr[low]);

                        if(val > arr[mid]){
                                //目标在右侧
                                low = mid+1;
                        }else if(val < arr[mid]){
                                //目标在左侧
                                high = mid-1;
                        }else{
                                // 定义放置索引下标的集合
                                List<Integer> list = new ArrayList<>();
                                // 将首次查找的位置放入集合
                                list.add(mid);

                                // 判断是否还有重复值
                                int index = mid + 1;
                                while(index < arr.length){
                                        if(arr[index] == val){
                                                list.add(index);
                                        }else{
                                                break;
                                        }
                                        index++;
                                }
                                index = mid-1;
                                while(index >= 0){
                                        if(arr[index] == val){
                                                list.add(index);
                                        }else{
                                                break;
                                        }
                                        index--;
                                }
                                return list;
                        }
                }
                return null;
        }

        /**
         * 有序的数组中查找某个元素出现的下标位置
         * 使用递归的二分查找
         * 返回出现的下标位置
         */
        public static int recursionInsertSearch01(int[] arr,int low,int high,int val){

                if(val < arr[low] || val > arr[high] || low > high){
                        return -1;
                }

                int mid = low + (high - low) * (val - arr[low])/(arr[high] - arr[low]);

                if(val > arr[mid]){
                        //目标在右侧
                        return recursionInsertSearch01(arr, mid+1, high, val);
                }else if(val < arr[mid]){
                        //目标在左侧
                        return recursionInsertSearch01(arr, low, mid-1, val);
                }else{
                        return mid;
                }
        }
        
        /**
         * 有序的数组中查找某个元素首次出现的下标位置
         * 使用递归的二分查找
         * 返回下标集合
         */
        public static List<Integer> recursionInsertSearch02(int[] arr,int low,int high,int val){

                if(val < arr[low] || val > arr[high] || low > high){
                        return null;
                }

                int mid = low + (high - low) * (val - arr[low])/(arr[high] - arr[low]);

                if(val > arr[mid]){
                        //目标在右侧
                        return recursionInsertSearch02(arr, mid+1, high, val);
                }else if(val < arr[mid]){
                        //目标在左侧
                        return recursionInsertSearch02(arr, low, mid-1, val);
                }else{
                        // 定义放置索引下标的集合
                        List<Integer> list = new ArrayList<>();
                        // 将首次查找的位置放入集合
                        list.add(mid);

                        // 判断是否还有重复值
                        int index = mid + 1;
                        while(index < arr.length){
                                if(arr[index] == val){
                                        list.add(index);
                                }else{
                                        break;
                                }
                                index++;
                        }
                        index = mid-1;
                        while(index >= 0){
                                if(arr[index] == val){
                                        list.add(index);
                                }else{
                                        break;
                                }
                                index--;
                        }
                        return list;
                }
        }
}

四. 斐波那契查找

1.概念

斐波那契查找也叫做黄金分割法查找,这种查找法其实也是二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。同样地,斐波那契查找也属于一种有序查找算法。

2.原理

对于斐波那契数列:1、1、2、3、5、8、13、21、34、55、89……(也可以从0开始),前后两个数字的比值随着数列的增加,越来越接近黄金比值0.618。比如元素个数为89的有序列表,89在斐波那契数列中是34和55相加所得。

把元素个数为89的有序列表分成:前55个数据元素组成的前半段和34个数据元素组成的后半段。那么前半段元素个数和整个有序表长度的比值接近黄金比值0.618,而前后两段长度的比值也接近黄金比值0.618。

假如要查找的元素在前半段,那么继续按照斐波那契数列来看,55 = 34 + 21,所以继续把前半段分成前34个数据元素的前半段和后21个元素的后半段,继续查找,如此反复,直到查找成功或失败。这样斐波那契数列就被应用到查找算法中了。

总长度=f[k],前半段长度=f[k-1],后半段长度=f[k-2]

有序列表的元素个数不是斐波那契数列中的数字时该如何处理呢?

当有序表的元素个数不是斐波那契数列中的某个数字时,需要把有序列表的长度补齐,让它成为斐波那契数列中的一个数值。

如果不是补齐,而是将多余的截掉是否可行?把原有序列表截断肯定是不可行的,因为可能把要查找的目标值截掉。

每次取斐波那契数列中的某个值时(f[k]),都会进行-1操作,这是因为数组下标从0开始。

3.代码实现

public class Test01 {
        public static void main(String[] args) {
                
                int[] arr = {1,13,25,37,49,51,62,68,70,80,80};
                
                List<Integer> fiboSearchList = fiboSearchList(arr, 80);
                System.out.println(Arrays.toString(fiboSearchList.toArray()));
        }
        
        public static List<Integer> fiboSearchList(int[] arr, int val) {
                
                int low = 0;
                int high = arr.length-1;
                
                // 斐波那契的索引下标。数组长度的数值在斐波那契数列中对应的索引下标
                int[] fiboArray = getFiboArray(10);//[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
                
                // 斐波那契的索引下标。数组长度的数值在斐波那契数列中对应的索引下标
                int k = 0;
                // 斐波那契的索引下标。数组长度的数值在斐波那契数列中对应的索引下标
                while(arr.length > fiboArray[k]){
                        k++;
                }
                System.out.println("k = " + k);//6
                System.out.println("fiboArray = " + Arrays.toString(fiboArray));//[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
                
                // 利用Java工具类Arrays 构造新数组并指向 数组 arr[]
                int[] temp = Arrays.copyOf(arr, fiboArray[k]);
                System.out.println("temp=" + Arrays.toString(temp));
        //[1, 13, 25, 37, 49, 51, 62, 68, 70, 80, 80, 0, 0]
                
                //对新构造的数组进行元素补充,补充为最高位的数值
                for (int i = high+1; i < temp.length; i++) {
                        temp[i] = arr[high];
                }
                System.out.println("补充数值的temp=" + Arrays.toString(temp));
        //[1, 13, 25, 37, 49, 51, 62, 68, 70, 80, 80, 80, 80]
                
                while(low <= high){
                        
                        //数列左侧有f[k-1]个元素
                        int mid = low + fiboArray[k-1] - 1;
                        
                        if(val < temp[mid]){
                                // 目标值小于mid所在元素,在左侧查找
                                high = mid-1;
                                
                                /*全部元素=前部元素+后部元素
                 * f[k]=f[k-1]+f[k-2]
                 * 因为左侧有f[k-1]个元素,所以可以继续拆分f[k-1]=f[k-2]+f[k-3]
                 * 即在f[k-1]的前部继续查找 所以k-=1
                 * 即下次循环 mid=f[k-1-1]-1
                 */
                                k-=1;
                        }else if(val > temp[mid]){
                                // 目标值大于mid所在元素,在右侧查找
                                low = mid+1;
                                
                                /*全部元素=前部元素+后部元素
                 * f[k]=f[k-1]+f[k-2]
                 * 因为右侧有f[k-2]个元素,所以可以继续拆分f[k-2]=f[k-3]+f[k-4]
                 * 即在f[k-2]的前部继续查找 所以k-=2
                 * 即下次循环 mid=f[k-1-2]-1
                        */
                                k -= 2;
                                
                        }else{
                                
                                // 定义放置索引下标的集合
                                ArrayList<Integer> list = new ArrayList<>();
                                list.add(mid);
                                
                                int index = mid+1;
                                while(index < arr.length){
                                        if(arr[index] == val){
                                                list.add(index);
                                                index++;
                                        }else{
                                                break;
                                        }
                                }
                                index = mid-1;
                                while(index > 0){
                                        if(arr[index] == val){
                                                list.add(index);
                                                index--;
                                        }else{
                                                break;
                                        }
                                }
                                return list;
                        }
                }
                return null;
        }
        
        public static int[] getFiboArray(int maxSize){
                
                int[] fiboArray = new int[maxSize];
                
                fiboArray[0] = 1;
                fiboArray[1] = 1;
                
                for (int i = 2; i < fiboArray.length; i++) {
                        fiboArray[i] = fiboArray[i-1] + fiboArray[i-2];
                }
                return fiboArray;
        }
}

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

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

相关文章

华为堆叠技术讲解

目录 为什么出现堆叠 什么是堆叠 堆叠的特征 堆叠的优缺点 华为堆叠技术 框式交换机堆叠技术CSS CSS堆叠涉及的相关基础概念 主交换机选举过程 堆叠系统主备倒换 CSS两种堆叠口 CSS堆叠方式 CSS以太网链路聚合 本地优先转发 CSS双主检测 CSS版本升级 CSS堆叠实…

java和vue车辆管理系统车管所系统

简介 车辆管理系统车管所系统&#xff0c;管理员添加车主信息&#xff0c;车主提交自己的车辆信息&#xff0c;管理员审核车辆&#xff0c;对车辆行进年检&#xff0c;统计&#xff0c;记录车辆违规信息。车主可以查看自己的车辆信息、投诉、查看自己的违规记录等。 演示视频…

【附源码】计算机毕业设计JAVA客户台账管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

2021亚太杯C题全网最全解题思路+塞罕坝林场数据数据分享

全网绝对能获奖的免费思路&#xff01;&#xff01;&#xff01; 文章目录1.写在前面&#xff0c;需要塞罕坝林场数据的这里链接获取&#xff1a;2.C题全网最全解题思路1.写在前面&#xff0c;需要塞罕坝林场数据的这里链接获取&#xff1a; https://download.csdn.net/downlo…

如何在SpringBoot项目中,实现记录用户登录的IP地址及归属地信息?

在登录模块&#xff0c;我们经常要记录登录日志&#xff0c;其中比较重要的信息有ip地址和ip归属地&#xff0c;像我们公司开发的产品会提供给用户试用&#xff0c;因为我们做的是无人机应用方向的&#xff0c;即使试用也会产生费用&#xff0c;因为我们很多功能一旦用了就会消…

GFS分布式文件系统及其部署

目录 一、GlusterFS 1 MFS 2 GlusterFS 二 、GlusterFs特点 1 扩展性和高性能 2 高可用性 3 全局统一命名空间 4 弹性卷管理 5 基于标准协议 三 GlusterFS 术语 1 Brick(存储块) 2 volume(逻辑卷) 3 FUSE 4 VFS 5 Glusterd (后台管理进程) 四 模块化堆枝式架构…

深度支持赛事宣发,DF平台助推第三届全国人工智能大赛顺利举办!

由深圳市人民政府和鹏城实验室主办、深圳市科技创新委员会与新一代人工智能产业技术创新战略联盟联合承办的人工智能领域顶尖赛事——第三届全国人工智能大赛已圆满落幕。DataFountain大数据竞赛平台&#xff08;简称DF平台&#xff09;作为本次大赛的宣传合作伙伴&#xff0c;…

EFK部署centos7.9(二)head插件部署

安装配置head监控插件 本人是在ES服务器安装head插件是Nodejs实现的&#xff0c;所以需要先安装Nodejs。 wget https://nodejs.org/dist/v14.17.6/node-v14.17.6-linux-x64.tar.xz 下载安装包 tar xf node-v14.17.6-linux-x64.tar.xz -C /usr/local/ 解压安装包 vim /e…

PostgreSQL实战之物理复制和逻辑复制(三)

目录 PostgreSQL实战之物理复制和逻辑复制&#xff08;三&#xff09; 3.1 单实例、异步流复制、同步流复制性能测试 3.1 读性能测试 3.2 写性能测试 PostgreSQL实战之物理复制和逻辑复制&#xff08;三&#xff09; 3.1 单实例、异步流复制、同步流复制性能测试 根据Post…

智慧交通解决方案-最新全套文件

智慧交通解决方案-最新全套文件一、建设背景二、思路架构1、先进性2、全智慧化3、可靠性4、保密性三、解决方案四、获取 - 智慧交通全套最新解决方案合集一、建设背景 智能交通系统是未来交通系统的发展方向&#xff0c;它是将先进的信息技术、数据通讯传输技术、电子传感技术…

kt-connect使用-k8s流量代理

1.下载kt安装包 地址: https://github.com/alibaba/kt-connect/releases 2.下载k8s集群的config文件 cd /root/.kube 下载服务器的config文件3.安装config文件 切换到用户目录C:\Users\yangx创建.kube文件夹mkdir .kube目录结构为C:\Users\yangx\.kube把下载config文件移动到…

XSS进阶三

目录实验目的预备知识实验环境实验步骤一实例七、和实例六好像木有区别实验步骤二实例八、有时候你要跳出你的思维实验步骤三实例九、将xss进行到底实验目的 1.深入理解xss工作原理。 2.怎么去绕过规则实现xss。 3.培养学生的独立思考能力。 预备知识 XSS基础、XSS进阶一。 …

字节跳动测试岗面试记:二面被按地上血虐,所幸Offer已到手...

在互联网做了几年之后&#xff0c;去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好&#xff0c;更重要的是&#xff0c;它是对你专业能力的背书&#xff0c;大厂工作背景多少会给你的简历增加几分竞争力。 但说实话&#xff0c;想进大厂还真没那么容易。最近面试字…

[力扣] 剑指 Offer 第二天 - 从尾到头打印链表

[力扣] 剑指 Offer 第二天 - 从尾到头打印链表题目来源题目描述题目分析解题思路递归反转数组&#xff08;切片&#xff09;代码实现递归执行结果复杂度分析反转切片执行结果复杂度分析总结耐心和持久胜过激烈和狂热。 题目来源 来源&#xff1a;力扣&#xff08;LeetCode&…

【微服务】如何利用Nacos Config实现服务配置?

微服务--Nacos Config1、前言2、Nacos Config2.1 简介2.2 常见的服务配置中心3、Nacos Config入门4、Nacos Config深入4.1 配置动态刷新4.2 配置共享4.2.1 同一个微服务不同环境之间共享配置4.2.2 不同微服务之间共享配置5、Nacos的几个概念6、总结1、前言 在前期的文章中&…

纯代谢冲上Nature不是幻想,蛋氨酸饮食可影响小鼠癌症预后,同样可影响人体代谢

百趣代谢组学文献分享一篇题名 "Dietary methionine influences therapy in mouse cancer models and alters human metabolism"&#xff0c;发表在Nature。文章是做的纯代谢研究&#xff08;饮食影响癌症和代谢&#xff09;。纯代谢冲上Nature&#xff0c;这篇文章是…

C++:重定义:符号重定义:变量重定义(三):解决变量重定义(声明extern外部变量)

在上一篇文章中&#xff0c;我们知道&#xff1a;可以通过声明 const/ static 变量来隔离变量在源文件的可见性&#xff0c;来解决变量重复定义的问题&#xff0c; C&#xff1a;重定义&#xff1a;符号重定义&#xff1a;变量重定义&#xff08;二&#xff09;&#xff1a;解…

链表题目 : 链表的中间结点 与 链表中倒数第k个结点(leetcode 和 牛客)

坚持看完&#xff0c;结尾有思维导图总结 快慢指针在链表中的运用链表的中间结点步骤例子分析奇数情况偶数情况程序链表中倒数第k个结点步骤解析程序链表的中间结点 leetcode 链接 步骤 设置两个指针来遍历链表&#xff0c;一个叫 fast 每次跳过两个元素&#xff0c;一个叫 …

浅谈网络损伤仪HoloWAN的使用场景

目录一、HoloWAN 应用于卫星通讯领域1.1 卫星通讯领域的背景和挑战1.2 使用HoloWAN实现卫星⽹络仿真二、HoloWAN 应用于网络游戏2.1 网络游戏的背景和挑战2.2 使用HoloWAN模拟真实的网络环境三、HoloWAN 应用于数据中心迁移3.1 数据迁移的背景和挑战3.2 使用HoloWAN进行在线性能…

客户文章|南方医科大学李克玄团队破解肠道宏病毒与心肌病关系

近日凌恩生物合作客户南方医科大学南方医院麻醉科刘克玄团队在医学期刊《JOURNAL OF MEDICAL VIROLOGY》上发表名为“Gut microbiota dysbiosis is associated with sepsis-induced cardiomyopathy in patients: A case‒control study”研究&#xff0c;该研究利用宏基因组测序…