Algorithm 计算hasmap与二进制搜索的O(n)

Algorithm 计算hasmap与二进制搜索的O(n),algorithm,hashmap,complexity-theory,binary-search,computation-theory,Algorithm,Hashmap,Complexity Theory,Binary Search,Computation Theory,我试图澄清在以下情况下如何计算O(n): 给定一个排序数组,如何找到两个和O(n)中给定数x相等的数 O(n)解决方案为: 移除阵列的第一个元素(e0) 将其添加到hashmap 移除阵列的第一个元素(e1) 目标是e1和x之间的差异 如果目标存在于哈希映射中,则返回该对 将e1添加到hashmap中 重复步骤3-6,直到找到一对或用尽元素 这将是最坏的情况O(n),因为您只需要在阵列上进行一次传递 O(n*logn)解决方案是: 从阵列中删除第一个元素(e1) Target是第一个元素和x之间

我试图澄清在以下情况下如何计算O(n):

给定一个排序数组,如何找到两个和O(n)中给定数x相等的数

O(n)解决方案为:

  • 移除阵列的第一个元素(e0)
  • 将其添加到hashmap
  • 移除阵列的第一个元素(e1)
  • 目标是e1和x之间的差异
  • 如果目标存在于哈希映射中,则返回该对
  • 将e1添加到hashmap中
  • 重复步骤3-6,直到找到一对或用尽元素
  • 这将是最坏的情况O(n),因为您只需要在阵列上进行一次传递

    O(n*logn)解决方案是:

  • 从阵列中删除第一个元素(e1)
  • Target是第一个元素和x之间的差
  • 二进制搜索数组的其余部分以查找目标
  • 如果存在,则返回该对
  • 重复步骤1-4,直到找到一对或用尽元素
  • 这是O(n logn),因为在最坏的情况下,您需要运行二进制搜索(logn)n/2次,得到O(n/2*logn),在大O中是O(n*logn)


    这是正确的吗?

    这听起来像是你正在学习的某门课程中的家庭作业问题。我不会为您解决这个问题-虽然在线找到解决方案很容易-但我会告诉您,我99%确定您的解决方案必须花费O(n)时间作为最坏情况的复杂性。基于散列的解决方案每次查找平均只需要O(1)个时间

    在你正在学习的某些课程中,这听起来像是一个家庭作业问题。我不会为您解决这个问题-虽然在线找到解决方案很容易-但我会告诉您,我99%确定您的解决方案必须花费O(n)时间作为最坏情况的复杂性。基于散列的解决方案每次查找平均只需要O(1)个时间

    是的,因为两种算法的ur分析都是正确的

    您的第一个算法也使用O(n)空间,因为hashmap。你可以避免

    Algo : 
    1. Consider begin = 0, and end = last_index
    2. Consider data[begin] and data[end]
    3. If data[begin] + data[end] > req_sum:
            end=end - 1  // u need to decrease ur total sum
       elif data[begin] + data[end] < req_sum:
            begin = begin + 1  // u need to increase ur total sum
       elif data[begin] + data[end] == req_sum:
              print("found")
    4. Continue from Step 2.
    
    算法:
    1.考虑开始=0,而结束=LaSTyx索引
    2.考虑数据[开始]和数据[结束]
    3.如果数据[开始]+数据[结束]>请求和:
    end=end-1//你需要减少你的总数
    elif数据[开始]+数据[结束]

    显然,要避免
    end
    和其他拐角处的情况

    是的,对于这两种算法,ur分析都是正确的

    您的第一个算法也使用O(n)空间,因为hashmap。你可以避免

    Algo : 
    1. Consider begin = 0, and end = last_index
    2. Consider data[begin] and data[end]
    3. If data[begin] + data[end] > req_sum:
            end=end - 1  // u need to decrease ur total sum
       elif data[begin] + data[end] < req_sum:
            begin = begin + 1  // u need to increase ur total sum
       elif data[begin] + data[end] == req_sum:
              print("found")
    4. Continue from Step 2.
    
    算法:
    1.考虑开始=0,而结束=LaSTyx索引
    2.考虑数据[开始]和数据[结束]
    3.如果数据[开始]+数据[结束]>请求和:
    end=end-1//你需要减少你的总数
    elif数据[开始]+数据[结束]

    显然,要避免
    end
    和其他拐角处的情况

    从数组中删除元素可能是O(N),这取决于您使用的语言/库,因此最好将元素留在数组中,否则您的运行时间将乘以O(N)。是的,指针肯定会更好,感谢您的建议从数组中删除元素可能是O(N),根据您使用的语言/库的不同,因此最好将元素保留在数组中,否则您的运行时间将乘以O(N)。是的,指针肯定会更好,谢谢您的建议。我只是建议他使用其他算法来解决此问题。他的硬件是证明上述算法的时间复杂度,但我没有。:)事实上,我是一个自作主张的程序员,所以这更符合我的兴趣。我一直在做一些有竞争力的编程和算法优化,所以我试图通过阅读维基百科和观看YouTube来了解时间复杂性。很高兴能得到一些反馈,因为我没有答题纸:-)我只是建议他用其他算法解决这个问题。他的硬件是证明上述算法的时间复杂度,但我没有。:)事实上,我是一个自作主张的程序员,所以这更符合我的兴趣。我一直在做一些有竞争力的编程和算法优化,所以我试图通过阅读维基百科和观看YouTube来了解时间复杂性。很高兴得到一些反馈,因为我没有答题纸:-)