Блог пользователя rajiv_kale

Автор rajiv_kale, история, 6 лет назад, По-английски

I am solving a question from CSES sum of four values. I found out the time complexity to be O(n^3) and n is 1000. But most of the solutions are within 0.12 seconds. Where I am going wrong with the calculation of time complexity.

Question is :: You are given an array of n integers, and your task is to find four values (at distinct positions) whose sum is x. CSES question link

The approach i am using is to store index of each element in unordered_map and then traverse the array using three loops to find three elements a1 , a2 , a3 and then check if sum-(a1+a2+a3) exists in map. It seems to be O(n^3) or O(n^3 *log n) with map , but it is getting passed within .12 or max .4 seconds. Shouldn't it get TLE verdict when n is 1000. Making O(1000000000).

I would like to know where I am wrong with the calculations.

  • Проголосовать: нравится
  • +6
  • Проголосовать: не нравится

»
6 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится

U can store a pairwise sum of elements in map.

  • »
    »
    6 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    Thanks but my question is how to calculate the time complexity of solution I submitted. It isn't O(N^3) otherwise it would have TLE but when I calculate it comes out to be O(N^3). It will be helpful if you can tell me how to calculate complexity for these tricky cases

    • »
      »
      »
      6 лет назад, скрыть # ^ |
      ← Rev. 2  
      Проголосовать: нравится +1 Проголосовать: не нравится

      The complexity is probably more like $$$\frac{1000\cdot999\cdot998}{6}$$$ since you can assume that the index of $$$a_1 \gt a_2 \gt a_3$$$. In c++ this can be quick enough (and I don't know if the test cases are strong).

      But still, that solution was probably not intended to pass and the author wanted the meet in the middle solution with complexity $$$O(n^2)$$$

      • »
        »
        »
        »
        6 лет назад, скрыть # ^ |
        ← Rev. 2  
        Проголосовать: нравится 0 Проголосовать: не нравится

        MZuenni i dont think meet in the middle would work. Can you prove me wrong please? I assume you are saying

        • we store all pairwise sums

        • sort the vector

        then we try meet in the middle for the new vector(say new_v) formed.

        why it wont work — suppose my one pointer is at s and another pointer is at e. Suppose new_v[s] + new_v[e] = required_sum BUT new_v[s] and new_v[e] have an element which is common to both e.g. new_v[s] was formed by a[5] + a[6] and new_v[e] was formed by a[5] + a[8]

        now what do you think is optimal? incrementing s or decrementing e? (i think neither). as it might happen new_v[s] + new_v[e - 1] was a possible answer. so can new_v[s + 1] + new_v[e]

        I may be wrong and i would really appreciate it if you could clarify this.

        • »
          »
          »
          »
          »
          6 лет назад, скрыть # ^ |
          ← Rev. 2  
          Проголосовать: нравится +1 Проголосовать: не нравится

          First, we create two sorted vectors $$$A, B$$$ with pairs. Second, we know there is a solution with the indices in sorted order, thus we only create pairs a,b with $$$a \lt b$$$. to solve ties in $$$A$$$ we try to minimize $$$b$$$ and to solve ties in $$$B$$$ we maximize $$$a$$$. Now while doing the meet in the middle we only combine entries from $$$(a,b)\in A$$$ with entries $$$(c,d)\in B$$$ where $$$b \lt c$$$.

    • »
      »
      »
      6 лет назад, скрыть # ^ |
      ← Rev. 2  
      Проголосовать: нравится 0 Проголосовать: не нравится

      Yes, your solution is O(N^3) with unordered map and O(N^3 * log n) with a tree map.

»
6 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится

I'm not sure why it would do that. On CF 10^9 would totally time out. That being said smarter loop indexing (i from 0->1000, j from i+1->1000, k from j+1 ->1000) can lead the complexity to be 1.66x10^8 (1000C3), with a very simple operation inside the loops. Other than that perhaps the judge is faster?