繁体   English   中英

将此 O(N) 线性搜索改进为 O(log N) 时间复杂度

[英]Improve this O(N) linear search to O(log N) time complexity

我正在尝试解决这个Geeks for Geeks 问题

找到出现一次的元素

给定一个由 N 个正整数组成的排序数组 A[],其中所有数字恰好出现两次,除了一个只会出现一次的数字。 找出只出现一次的数字。

你的任务:
您不需要读取输入或打印任何内容。 您的任务是完成带有两个参数(数组 A 和整数 N)并返回仅出现一次的数字的函数 search()。

预期时间复杂度: O(Log(N))。
预期的辅助空间: O(1)。

约束
0 < N <= 10^6
0 <= A[i] <= 10^9

我的做法:

对于给定的Array:A & Size:N
Initialize i With 0 i=0 # i 是数组遍历中的索引引用
循环从0 to N-1 # While i<N :
Array :A选择第i^th元素Array :A # select=A[i]
创建一个子数组(next) 不包含select # next=A[i+1:]
现在将next (子数组)与select
如果它包含select的副本/副本
select推到一个新的子数组previous )#前一个保留访问元素的记录
i to +1更新i to +1并重复此过程
下一个 tym新值iselect=A[i+1]select=A[i+1]
检查是否在子阵列存在next &&
如果previous子数组也没有包含select #Hopefully 它被遍历到第一个 tym 并且它是唯一的
返回不previousnext子数组中的i^th元素

代码:

# Function to recognize singular element i

def check(list,n):
 i=0
 select=0
 next=0
 previous=[]
 while(i<n):
  select=list[i]
  next=list[i+1:]
  if select in next:
    previous.append(select)
  elif select in previous:
    pass
  else:
   return select
  i+=1
  



# Driver Code
def main():
 list=[]
 n =int(input('Enter Size of array:'))
 for a in range(0,n):
  x=int(input('Array[{}]='.format(a)))
  list.append(x)
 i=check(list,n)
 print('The No.is :',i)

main()

上面的脚本有效但不是 O(log N)。 我尝试删除额外的变量并将额外的子数组转换为变量以减少时间。

[免责声明] (不是问题的答案,但可能是解决实际问题的另一种方法。)试试这个平台接受的方法。 但在我看来,它是 O(n)...虽然对关于时间复杂性的问题陈述感到困惑 - 它专门要求 O(log N))。 但它接受...

def search(self, A, N):
    ans = 0
    for x in A:
        ans ^= x
    return ans

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM