给定一个由n个元素组成的数组和数组中的一个元素x,有没有一种快速的方法可以在不排序的情况下找到x的秩?
由于我现在处理的是一个非常大的数组,O(n)时间复杂度的算法对我来说仍然太慢了,这就是为什么我试图寻找排序之外的其他选择。
编辑:
所以现在我的算法类似于:
for x in list:
A = x.dot(B) ## return a numpy array
rank = findRank(a, A) ## find the rank of a in A
doSomething2(rank)
所以这里我的瓶颈是findRank(),在我当前的实现中,我首先对数组进行
关于这一算法:
Algo(A, p, r)
if p ≤ r then
q ← Partition(A,p,r)
if q == r then
return A[q]
else
return Algo(A,q+1,r)
end
end
而分区是:
Partition(A,p,r)
x=A[r]; j=r; i=p-1;
While true
repeat j ← j - 1
until A[j]<x
repeat i ← i +1
until A[i] >= x
if i<j
then A[i] ←
我遇到了一个类似于Given a million integers, return the kth smallest element的问题。问题下面有一个给定的解决方案,我不知道为什么这是一个最优的解决方案。给定的解决方案涉及使用最小堆。所以最初,我认为这是有意义的,因为我们可以在恒定的时间内找到堆中最小的元素。但是,在我想了一会儿之后,我考虑了将数组中的元素插入堆中的成本。如果我的理解是正确的,插入是一个O(logN)操作。但是,如果我们要插入N元素,那么这将花费我们O(NlogN)时间。我们还在使用我们正在使用的堆的额外空间。所以我的问题是,为什么这是一个比仅仅排序数组和接受KTH-1索引
在我学习算法设计的过程中,我开始练习一些问题,我很难找到一个有效的解决方案。
给出一个整数数组A,求出在Ai <= Aj约束下j-i的最大值.A:3 5 4 2输出:2对(3,4)
def maxIndex(arr):
max_val = float("-inf")
for i in range(0,len(arr)):
for j in range(i + 1 , len(arr)):
#print(arr[i],arr[j])
if arr[i] <= arr[j]:
diff_i = j - i
我试图了解是否有任何替代蛮力算法(或轻微的改进/最坏的性能比幼稚的蛮力算法)仍然将导致O(N^2)的时间复杂性和O(1)辅助空间。
这是我的蛮力伪码:
procedure distinct(Input: array)
for i=0 to i < length of array
for j=i+1 to j < length of array
if array[i] ==
我用Java创建了一个非常简单的链表:
public class LinkedList {
class Node {
public Node next;
public int item;
public Node (int item) {
this.item = item;
}
}
int listSize = 0;
Node first = null;
Node last = null;
public void add(int n) {
我的职能如下:
function myFunction(array, sum){
for(var i = 0; i < array.length; i++){
var firstValue = array[i];
for(var x = i + 1; x < array.length; x++){
var secondValue = array[x];
if((firstValue + secondValue) == sum){
我的问题是,有没有可能将(未知数量的数组)合并成一个数组?我不知道确切的数组数量(不像合并两个数组合并n个array.so等)。签名:
> int [] merge(int k)//k is number of arrays to be merged into a one
> merge them
//and so on..
>
> return array;
我必须从数组中构造一个最大堆(在下面的代码中称为nums ),所以我使用了java.util.PriorityQueue。
我的代码如下所示:
PriorityQueue<Integer> pq = new PriorityQueue<>(nums.length, (a, b) -> b - a);
for (int i = 0; i < nums.length; i++) {
pq.offer(nums[i]);
}
我试图找出上述for循环的时间复杂度(大-O表示法)。
我理解PriorityQueue没有指定底层数据结构增长的细节。(在最坏的情
我做了一个程序(hw),计算所有单词的频率。我的所有算法都采用O(n)或O(n log n),而我的字计数器则采用O(n^2)。
该算法如下所示:
for (int i = 0; i < no of elements; i++)
for (int j = 0; j < no of elements; j++)
if (the ith word == the jth word)
{
increase that word counter by 1;