> 11 | T discrete_golden_section_search(T low, T high, auto f, Compare cmp = less<>()){ 12 | assert(low < high); 13 | if(high - low >= 10){ 14 | double phi = (sqrt(5) - 1) / 2; 15 | T mid1 = high - (high - low) * phi, mid2 = low + (high - low) * phi; 16 | auto val1 = f(mid1), val2 = f(mid2); 17 | while(high - low >= 10){ 18 | if(cmp(val1, val2)){ 19 | high = mid2, mid2 = mid1, val2 = val1; 20 | mid1 = high - (high - low) * phi, val1 = f(mid1); 21 | } 22 | else{ 23 | low = mid1, mid1 = mid2, val1 = val2; 24 | mid2 = low + (high - low) * phi, val2 = f(mid2); 25 | } 26 | } 27 | } 28 | T res = low; 29 | auto val = f(res); 30 | for(auto x = low + 1; x < high; ++ x) if(auto xval = f(x); cmp(xval, val)) res = x, val = xval; 31 | return res; 32 | } 33 | ]]>
> 10 | T discrete_ternary_search(T low, T high, auto f, Compare cmp = less<>()){ 11 | assert(low < high); 12 | while(high - low >= 3){ 13 | T mid = low + (high - low >> 1); 14 | cmp(f(mid), f(mid + 1)) ? high = mid + 1 : low = mid; 15 | } 16 | T res = low; 17 | auto val = f(res); 18 | for(auto x = low + 1; x < high; ++ x) if(auto xval = f(x); cmp(xval, val)) res = x, val = xval; 19 | return res; 20 | } 21 | ]]>