задача:

написать функцию которая на вход получает числовой вектор, а на выходе выдает вектор, i-ая координата которого - это максимальное значение из первых i-элементов вектора на входе желательно - оптимизировать по скорости выполнения

R-functions

neighbors<-function(v) 
{ 
    n<-length(v)
    if(n<2) return (v)
    for (i in 2:n)
        if (v[i]<v[i-1]) 
                    v[i]<-v[i-1] 
    v
                    
}

withMax<-function(v) 
{ 
    n<-length(v)
    if(n<2) return (v)
    max=v[1]
    for (i in 2:n)
        if (v[i]<max) 
            v[i]<-max
        else
            max<-v[i]
v                    
}

withWhichAndRep<-function(v) 
{ 
    n<-length(v)
    if(n<2) return (v)
    max=v[1]
    v1=numeric(0)
    # The index of the maximum element
    m=which.max(v)
    for (i in 1:m)
       {
        if (v[i]>max)max=v[i] 
        v1[i]<-max
       } 
    # Merge of vector v1 and vector with repeating of maximum
     v1<-c(v1,rep(v[m],n-m))
     v1
                    
}

withIfElse<- function(v) {
     n<-length(v)
    if(n<2) return (v)
    max=v[1]
    for (i in 2:n)
    {
        max=ifelse(v[i]>max,v[i],max)
        v[i]=max
        
    }       
    v   
}
withV1AndMax<- function(v) {

    v1=numeric(0)   

    for (i in 1:length(v))
    {
        # Attachment the elements to the vector and calculate of maximum
        v1[i]=v[i]
        v1[i]=max(v1)       
    }      
    v1  
}

cpp-functions in R

library(Rcpp)
# without STL and pointers (poiner don't work with numeric)
# NumericVector - special R type (numeric)
cppFunction('
NumericVector vecCpp(NumericVector v) {

    int n=v.size();
    if(n<2) return v;
    int max=v[0];
    for(int i=1;i<=n;i++)
    if (v[i]<max) v[i]=max;
                 else max=v[i];
    return v;
} 
')
# within STL and iterators
cppFunction('
NumericVector vecSTL(NumericVector v) {
    if(v.size()<2) return v;
    
  int i=1;
  double max = v[0]; 

  NumericVector::iterator it;
  for(it = v.begin() + 1; it != v.end(); ++it,i++) 
    if (*it<max) v[i]=max;
     else max=*it;

  return v;
}
')

Calculation

# The  random vector of 1000 dimension 
set.seed(12345)
v<-sample.int(200, size =1000,replace=T)
v
##    [1] 145 176 153 178  92  34  66 102 146 198   7  31 148   1  79  93  78
##   [18]  81  36 191  91  66 194 142 129  78 140 109  46  97 159   2  38 137
##   [35]  75  73 174 181 124  27 157  86 186 155  52  65  13   9  12 126 193
##   [52] 166  64  43 147 100 146  17  88  48 159  52 198 152 196  44 190  30
##   [69] 121 190 138 102  75  68  10 124 193 131 103  31 175 103   2   4  29
##   [86]  62 166 101 161  13 186 162  16 121 143 103 145 150  20  80  59 124
##  [103] 195 124 105 181 128 173  51  44 122  77 152  76 159 182 197 118   2
##  [120]  65 112 103  18 137 142 161 189  38  56 155   7 135 163 133 189 175
##  [137] 140  38  20 162 105 139  44 126  30 192 199 100 184  75 166 112 160
##  [154]  71  42 157 137  87 170 121 149 119 171 163  77  99 199  35 167  80
##  [171] 194  38 150  62  76 151 141 185 160 166  34  82  40  52 195 163  70
##  [188] 188  33  32 151 178  62  63 197   2  55 160  49  92 118 179  25 103
##  [205] 133 154  19  14 112 131  60 140  76  53 189  87  66 107 126  35  22
##  [222]  22  19 107 180 143 182  88  94 120  62 115  96 140 148 104 198 184
##  [239]  95  77 188 189 182 157 126 136 188 107  68 159  25 192   7  52 176
##  [256] 170   4  37  24  96 190 166 163 184 141  17  24 159 200 139  30  64
##  [273]  32 200 150  79 111   6  68 172  26 159  20   4  56  83  14 160 102
##  [290] 104 142 167  13  68 161  57 163  44 112   4  11 120 142 131 116 136
##  [307]  42  48  92  69  81  87 192  45  74 177 106 118  52 174  63 135 124
##  [324]  81  81 193  63   4  33  46  78 170 148 135  22  12 193 146  99 177
##  [341] 116 139 183 168 103 126 160 189   9 151 137 125 199 128 132 146 118
##  [358] 116   7 158  37  34  97  49  69 144 175  51 159 115 107 157 186 125
##  [375] 130  87  87 196  62  92 142 163  62 136 157 173 124  38 181   7 158
##  [392] 171 161  34  66  40  66  77 102  26  16  95  53  47 120  32 172  48
##  [409] 160  16 109 144   9   6 149 155 108  78  94  25 168  54  40  51  78
##  [426] 169 197  62  55 125 125  12 150  63   9 114   4 176 106  22 162 162
##  [443]   3 137  89 181  79   1 193 194 150  81  84 165 101 140 188  52 107
##  [460]  19 107 185  44 173 114  80 121  76 163  59  64  84 156 129  53  63
##  [477] 147 156 120  24  49  53  58 107  80 129  29 174  92 180 156 164 200
##  [494] 118  94  67 142 152 155 175  42 154 169 187 136 172  16 128  80 150
##  [511] 148  75  68 135  65 137  43  50  25 158 153  40 180 120  89  60  61
##  [528] 115 187 162  88  72 104 131 138 165  24 184  51  82  53  65  49 108
##  [545] 144 108   4 125 121 153 175  89 102 179  76  52  34  18 137  72  14
##  [562]  14 114 137  39  54 189 104 149  45 128 126 109  49  50  94 167  47
##  [579] 156 105  67 156  48  68  85 140 132 145  33  11 115  23   4 156  54
##  [596] 137  45 195 136 157 140   3 101 147  66 165 177 172  91  95 104  33
##  [613] 177  41 127   9  75 121 191  43  36 174  94  46 182 195 192 110 197
##  [630]  70  76  85  57  14  16  87 198  23  45  45 130 102 146  64 170 102
##  [647] 137 189   3 105 165  66 137 124 131 192  47  66 168  30 185  18 138
##  [664] 194 128  85 162  53 132 117 129   6  13 197 188  40 139  66 136  15
##  [681] 197  26  76 171 166 135 141 177  93 141  89 183  24  12 142 174   1
##  [698] 152 157  99 124  72  94  60  15 145  28 156 171  69  72 188 128  68
##  [715] 103  88 137 182  36  53  71   7   7  19 123   4  85  17 102 108 149
##  [732] 128 125 172 191 125 150  23  79 184  89  14 192 189 137  12 144  66
##  [749] 150 189  44 149 176  92   5  54 156 143 198   4  64  51  92 107 129
##  [766] 185  60 163 139  39  89 172 164  63 198  79  24   4  68 166 158  76
##  [783] 139 122 110 172  72  62 121  66 121  50 148   4 125 173  98  98  17
##  [800]  80 147 190 101   8 123  23  32  32  54  57 160  91  94 117  67 152
##  [817]  23 188  31 108  34 123  88 150 178  28 106 141  38  11  99 129 126
##  [834]  96  36  87  26 138 173 111 140  56 124 104  58 101 117  34 179 100
##  [851]  67 191 182  62  45  61 179 124 146 123  42  19  97 162 114 133  23
##  [868]  15 131 184 138  40 198 103 163  87 158   4 195  33 131  70 148  83
##  [885] 109 146 169  75 178   5 139  33  37  20   3  37 134  62  31  53 153
##  [902]  24 170  66  57  11  67 113 169  34 178  35 187 149  88 155  35  68
##  [919] 128  68  20 143  79 110 113  56  38  19  91 170  40 130  32 176  37
##  [936] 122   4  71  89 119 181 124  98 165   3 183 142 114 160 112  62  68
##  [953]  55  47  61  99 100  35  93  68  99 104  90 133  90 103 135  83  16
##  [970] 154 117 184 155 187 112 130 113  82 119 183  25  90 161 189  81  72
##  [987]   5 149  82   5 118  54  47 107  40 173  92  45  76  27
# The first 30 elements of result vectors
head(vecCpp(v),30)
##  [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(vecSTL(v),30)
##  [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(cummax(v),30)
##  [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(neighbors(v),30)
##  [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(withIfElse(v),30)
##  [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(withV1AndMax(v),30)
##  [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198
head(withWhichAndRep(v),30)
##  [1] 145 176 176 178 178 178 178 178 178 198 198 198 198 198 198 198 198
## [18] 198 198 198 198 198 198 198 198 198 198 198 198 198

Analysis

library(microbenchmark)
compare <- microbenchmark(vecCpp(v),
                        vecSTL(v),
                        cummax(v), 
                        neighbors(v),
                        withIfElse(v),
                        withV1AndMax(v),
                        withWhichAndRep(v),
                        times = 1000)

library(ggplot2)
autoplot(compare)

Conclusions

Winners:

                    cummax()
                    
                    vecCpp()
                    
                    vecSTL()
                
                    withWhichAndRep()