faster implementation of sum ( for Codility test )

前端 未结 22 2084
鱼传尺愫
鱼传尺愫 2021-02-04 11:47

How can the following simple implementation of sum be faster?

private long sum( int [] a, int begin, int end ) {
    if( a == null   ) {
        ret         


        
相关标签:
22条回答
  • 2021-02-04 12:37

    100% correctness and performance of this code is tested

    Private Function equi(ByVal A() As Integer) As Integer
            Dim index As Integer = -1
            If A.Length > 0 And Not IsDBNull(A) Then
                Dim sumLeft As Long = 0
                Dim sumRight As Long = ArraySum(A)
                For i As Integer = 0 To A.Length - 1
                    Dim val As Integer = A(i)
    
                    sumRight -= val
                    If sumLeft = sumRight Then
                        index = i
                    End If
                    sumLeft += val
                Next
            End If
    
            Return index
        End Function
    
    0 讨论(0)
  • 2021-02-04 12:38

    I have scored 100% for this one:

    int equi (int[] A)
    {
        if (A == null) return -1;
    
        long sum0 = 0, sum1 = 0;
    
        for (int i = 0; i < A.Length; i++) sum0 += A[i];
    
        for (int i = 0; i < A.Length; i++)
        {
            sum0 -= A[i];
            if (i > 0)
            {
                sum1 += A[i - 1];
            }          
            if (sum1 == sum0) return i;      
        }        
        return -1;
    }
    
    0 讨论(0)
  • 2021-02-04 12:41

    If this is based on the actual sample problem, your issue isn't the sum. Your issue is how you calculate the equilibrium index. A naive implementation is O(n^2). An optimal solution is much much better.

    0 讨论(0)
  • 2021-02-04 12:42

    Some tips:

    • Use a profiler to identify where you're spending a lot of time.

    • Write good performance tests so that you can tell the exact effect of every single change you make. Keep careful notes.

    • If it turns out that the bottleneck is the checks to ensure that you're dereferencing a legal address inside the array, and you can guarantee that begin and end are in fact both inside the array, then consider fixing the array, making a pointer to the array, and doing the algorithm in pointers rather than arrays. Pointers are unsafe; they do not spend any time checking to make sure you're still inside the array, so therefore they can be somewhat faster. But you take responsibility then for ensuring that you do not corrupt every byte of memory in the address space.

    0 讨论(0)
  • 2021-02-04 12:43

    Here is my answer with with explanations on how to go about it. It will get you 100%

    class Solution
    {
        public int solution(int[] A)
        {
            long sumLeft = 0;       //Variable to hold sum of elements to the left of the current index
            long sumRight = 0;      //Variable to hold sum of elements to the right of the current index
            long sum = 0;           //Variable to hold sum of all elements in the array
            long leftHolder = 0;    //Variable that holds the sum of all elements to the left of the current index, including the element accessed by the current index
    
            //Calculate the total sum of all elements in the array and store it in the sum variable
            for (int i = 0; i < A.Length; i++)
            {
                //sum = A.Sum();
                sum += A[i];
            }
            for (int i = 0; i < A.Length; i++)
            {
                //Calculate the sum of all elements before the current element plus the current element
                leftHolder += A[i];
                //Get the sum of all elements to the right of the current element
                sumRight = sum - leftHolder;
                //Get the sum of all elements of elements to the left of the current element.We don't include the current element in this sum
                sumLeft = sum - sumRight - A[i];
                //if the sum of the left elements is equal to the sum of the right elements. Return the index of the current element
                if (sumLeft == sumRight)
                    return i;
            }
            //Otherwise return -1
            return -1;
        }
    }
    
    0 讨论(0)
  • 2021-02-04 12:44

    Here is my solution and I scored 100%

     public static int solution(int[] A)
        {
            double sum = A.Sum(d => (double)d);
            double leftSum=0;
            for (int i = 0; i < A.Length; i++){
                if (leftSum == (sum-leftSum-A[i])) {
                    return i;
                }
                else {
                    leftSum = leftSum + A[i];
                }
            }
            return -1;
        }
    
    0 讨论(0)
提交回复
热议问题