`
YuHuang.Neil
  • 浏览: 187645 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Algorithm 04 : 寻找两个有序数组中的第N个数,要求时间复杂度为O(logm+logn)

阅读更多
Question : Give a divide and conquer algorithm for the following problem : you are
                 given two sorted lists of size m and n, and are allowed unit time access
                 to the ith element of each list. Given an O(logm+logn) time algorithm for
                 computing the kth largest element in the union of the two lists.
                 (For simplicity, you can assume that the elements of the two lists are
                 distinct).

问题:寻找两个有序数组中的第N个数,要求时间复杂度为O(logm+logn)。



/**
  * @author YuHuang
  * @vision 2011-10-04
  * This program is only for algorithm training.
  *
  */

import java.lang.RuntimeException;

public class SearchKthNumber {

        private int[] aArray;
        private int[] bArray;

        public SearchKthNumber(int[] aArray,int[] bArray){
                this.aArray=aArray;
                this.bArray=bArray;
                if(this.aArray==null||this.bArray==null){
                        throw new RuntimeException("Array should not be null!");
                }
        }

        public int doSearch(int aLeft,int aRight,int bLeft,int bRight,int k){
                int aMiddle = (aLeft+aRight)/2;
                int bMiddle = (bLeft+bRight)/2;

                if(aLeft>aRight){
                        return bArray[bLeft+k-1];
                }

                if(bLeft>bRight){
                        return aArray[aLeft+k-1];
                }

                if(aArray[aMiddle]>bArray[bMiddle]){
                        if(k<=(aMiddle-aLeft)+(bMiddle-bLeft)+1){
                                return doSearch(aLeft,aMiddle-1,bLeft,bRight,k);
                        }else{
                                return doSearch(aLeft,aRight,bMiddle+1,bRight,k-(bMiddle-bLeft)-1);
                        }
                }else{
                        if(k<=((aMiddle-aLeft)+(bMiddle-bLeft)+1)){
                                return doSearch(aLeft,aRight,bLeft,bMiddle-1,k);
                        }else{
                                return doSearch(aMiddle+1,aRight,bLeft,bRight,k-(aMiddle-aLeft)-1);
                        }
                }
        }


        public static void main(String[] args){
                int[] aArray=new int[]{1,3,5,6,8,9,11,18,20};
                int[] bArray=new int[]{2,4,7,16,22,29,39,40,55,100};

                SearchKthNumber sn=new SearchKthNumber(aArray,bArray);
                int k=2;
                int result=sn.doSearch(0,aArray.length-1,0,bArray.length-1,k);
                System.out.println("The "+k+"th"+" Number : "+result);
        }

}





欢迎提出更优化的解决方案,谢谢!

分享到:
评论

相关推荐

    时间复杂度为O(logN)的常用算法,算法数据结构

    O(logN)的时间复杂度是一种高效的算法复杂度,意味着算法的运行时间与问题规模的对数成正比。这样的算法通常在处理大规模数据时表现出色,因为它们能够快速定位到所需的元素或解决问题。以下是三个具有O(logN)时间...

    找出数组3个数字相加为0的组合

    在内层循环中,通过`left`和`right`指针寻找另外两个数,使三者的和为零。注意,为了避免重复解,我们还需检查当前元素与前一个元素是否相等,并在找到解后跳过可能的重复值。 这种解决方案的时间复杂度是O(n^2),...

    数组中最大和的子数组

    在数组中,子数组是由数组中任意两个下标i和j(i )确定的一段连续元素的集合,即原数组的第i个元素到第j个元素。因此,数组A[0...n-1]的子数组可以表示为A[i...j],其中0 &lt;= i &lt;= j &lt; n。 解决这个问题的关键在于...

    一种O_n_nlog_2m_时间复杂度的排序算法.pdf

    在《一种O(n + nlog₂m)时间复杂度的排序算法》这篇论文中,作者提出了一种新颖的排序算法,该算法的时间复杂度为O(n + nlog₂m),其中m为原始输入数据序列中有序或逆序子序列的数量,范围为1到n²(1 ≤ m ≤ n²)...

    内部排序算法实现及比较.doc

    快速排序是一种内部排序算法,它的时间复杂度为O(n log n),空间复杂度为O(log n)。快速排序的算法步骤如下: 1. 选择一个元素作为枢轴元素。 2. 将数组中的所有元素分为两个部分:小于枢轴元素的部分和大于枢轴...

    DeShuiYu#labuladong_algorithm#如何去除有序数组的重复元素1

    5.5 如何去除有序数组的重复元素本文对应的力扣题目:26.删除排序数组中的重复项83.删除排序链表中的重复元素删除排序数组中的重复项:// 长度为索引 + 1

    algorithm: analysis and design exams

    插入操作的时间复杂度取决于需要移动的元素数量,平均情况下需要移动j/2个元素,因此总时间复杂度为O(n^2)。如果数组已经接近排序,则插入操作的时间复杂度可以降为O(n)。 **3. 使用链表的影响(c)** - **问题...

    Sorted Algorithm

    它的平均和最坏时间复杂度为O(n²),在最佳情况下(已排序数组)的时间复杂度为O(n)。 2. 插入排序(Insertion Sort) 插入排序将数组分为已排序和未排序两部分,每次将一个未排序元素插入到已排序部分的正确位置。...

    C语言实现在数组A上有序合并数组B的方法

    分析:如果由前至后合并,复杂度将会是O(N2),这样的复杂度显然不是最优解,利用两个指针指向两个数组的尾部,从后往前遍历,这样的复杂度为O(n2) 由此可以写出下面的代码: #include #include &lt;algorithm&gt; #...

    algorithm详解1

    3. 选择排序(Selection Sort):每次找出未排序部分的最大/小元素与未排序部分的第一个元素交换,时间复杂度为O(n^2)。 4. 快速排序(Quick Sort):利用分治策略,选取一个基准元素,将小于基准的放左边,大于...

    分制算法求第N小的数

    在这种情况下,可以考虑使用更高效的算法,例如快速选择算法,它是在快速排序的基础上修改而来,专门用于寻找数组中的第K小(大)元素,平均时间复杂度为O(n),但最坏情况下为O(n^2)。不过,对于这个问题,简单的...

    java常见算法...........

    - 二分查找:适用于有序数组,时间复杂度为O(logn)。 - 哈希查找:通过哈希表快速定位,理想情况下时间复杂度为O(1)。 3. 图算法: - 广度优先搜索(BFS):用于遍历图,找到最短路径。 - 深度优先搜索(DFS):...

    基于C++,写一个程序 要求用户输入10个数据到数组中,然后将数组中最大值和最小值显示出来,并显示下标

    为了找到最大值和最小值,我们可以初始化两个变量,分别作为当前的最大值和最小值,并设定初始值为数组的第一个元素。然后再次遍历数组,与当前最大值和最小值进行比较,如果找到更大的值就更新最大值,找到更小的值...

    leetcode下载-Algorithm:算法题积累

    leetcode下载 [toc] 一、题目 Q1 等差数列求和 ...在一个无序数组中,任意相邻两个数不等 局部最小数:这个数比它的左边和右边都小,这个数被称为局部最小 问题:找到任意一个(随便一个)局部最小的

    经常使用查找和排序算法_Java_下载.zip

    4. 斐波那契查找:在有序数组中,结合斐波那契数列进行查找,平均时间复杂度为O(log n)。 接下来是排序算法,它们用于重新排列数据集合,使得元素按照特定顺序排列。Java中的常见排序算法有: 1. 冒泡排序:通过...

    LeetCode前400题Java精美版

    4. **Median of Two Sorted Arrays** (Hard): 寻找两个有序数组的中位数。常用的方法是二分查找,通过缩小搜索范围来降低时间复杂度。 5. **Longest Palindromic Substring** (Medium): 找出字符串中最长的回文子串...

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录

    对于小规模数据或接近有序的数组,插入排序表现良好,时间复杂度为O(n^2)。 4. 希尔排序:希尔排序是对插入排序的一种改进,通过增量序列将数据分组进行排序,然后逐渐减少增量直到为1。其时间复杂度通常比O(n^2)好...

    关于数组的几道面试题1

    对于两个有序数组,可以采用双指针法,分别从头开始比较,找到相同的元素。 7. **求三个数组的共同元素**: 可以先找出两个数组的交集,再找这个交集与其他数组的交集。 8. **找出数组中唯一的重复元素**: ...

    排序算法: 冒泡排序,桶排序,计数排序,堆排序,插入排序,合并排序,快速排序,基数排序,选择排序,希尔排序 Python实现

    冒泡排序的时间复杂度为O(n^2),适用于小规模或部分有序的数据。 2. **桶排序**:桶排序是一种分布式排序算法,它将数据分到有限数量的桶里,每个桶再分别排序。当输入数据均匀分布时,桶排序可以达到线性时间...

Global site tag (gtag.js) - Google Analytics