完全披露这是一个家庭作业问题,因此,我不会要求具体的解决方案,只是一些问题的一般答案.问题的内容如下:
Given a sorted array of type T that must implement the Comparable interface,
write a Java generic method that finds a specific element in the array
and returns it, or returns null if it is not found. Note that your algorithm
must run worse-case in log base 3 time, a log base 2 (binary search) solution
will receive no credit
还有一个额外的规定,算法必须是迭代的,而不是递归的.
1)所以我的第一个问题是,如何确定算法在log base 3中运行而不是log base 2?这两者只有一个常数因子不同,所以即使我分析算法的结构,我怎么知道我是在Log3(n)时间运行,还是只运行在(~0.63)(Log2(n))时间?它甚至重要吗?
2)我认为二进制搜索或多或少是用于搜索排序数组的标准快速算法,所以除了二进制和线性搜索之外,还有哪些其他搜索算法可供我们寻找灵感?
3)是否有一些我缺少的东西,一些规定可以让搜索阵列比标准二进制搜索更快?
任何帮助都非常感谢,如果这个问题相当具体,我很抱歉,但我认为它的某些部分通常是适用的.
最佳答案 >是,O(log(n))不关心log是base 2还是base 3.
>现在假设任务是使用不超过一定数量的比较.我们可以证明,在最坏的情况下,在不超过log3(N)比较的情况下解决它是不可能的.对于初学者来说,如果数组有三个元素,那么在进行一次比较后就无法找到该元素或报告它丢失.同样,对于九元素阵列,两次比较显然是不够的.人们可以使用鸽子原则和一些关心来证明大N也是不可能的,尽管我承认我在几分钟内没有做出简短的证据.
证明我尝试大N的证据就是这个(虽然细节变得乏味).如果所有数组元素都是不同的并且也不同于我们搜索的那个X,那么在询问K个问题之后我们只得到K比特的信息,因此可以区分不超过2K的数组X可能是哪个.然后,存在一定长度的段(例如,3个元素),并且在其中,我们没有比较但仍然可以等于X的元素.将其更改为X,并且我们获得反例数组.