{"id":25910,"date":"2019-07-04T20:36:28","date_gmt":"2019-07-05T00:36:28","guid":{"rendered":"https:\/\/www.dannyadam.com\/blog\/?p=25910"},"modified":"2020-01-14T22:42:56","modified_gmt":"2020-01-15T03:42:56","slug":"smawk-in-cpp","status":"publish","type":"post","link":"https:\/\/www.dannyadam.com\/blog\/2019\/07\/smawk-in-cpp\/","title":{"rendered":"SMAWK in C++"},"content":{"rendered":"\n<p>I recently implemented <a href=\"https:\/\/github.com\/dstein64\/kmeans1d\">kmeans1d<\/a>\u2014discussed in a prior <a href=\"https:\/\/www.dannyadam.com\/blog\/2019\/07\/kmeans1d-globally-optimal-efficient-1d-k-means\/\">post<\/a>\u2014for efficiently performing globally optimal 1D <em>k<\/em>-means clustering. The implementation utilizes the <a href=\"https:\/\/en.wikipedia.org\/wiki\/SMAWK_algorithm\">SMAWK algorithm<\/a> (Aggarwal et al., 1987), which calculates <code>argmin(<em>i<\/em>)<\/code> for each row <em>i<\/em> of an arbitrary <code>n \u00d7 m<\/code> <em>totally monotone<\/em> matrix, in <code>O(m(1 + lg(n\/m)))<\/code>.<\/p>\n\n\n\n<p>I&#8217;ve factored out my SMAWK C++ code into the example below. In general, SMAWK works with an <em>implicitly<\/em> defined matrix, utilizing a function that returns a value corresponding to an arbitrary position in the matrix. An <em>explicitly<\/em> defined matrix is used in the example for the purpose of illustration.<\/p>\n\n\n\n<p>The program prints the column indices corresponding to the minimum element of each row in a totally monotone matrix. The matrix is from <a href=\"http:\/\/web.cs.unlv.edu\/larmore\/Courses\/CSC477\/monge.pdf\">monge.pdf<\/a>\u2014a course document that I found online.<\/p>\n\n\n<p><!--more--><\/p>\n<p><style>.gist table { margin-bottom: 0; }<\/style><div style=\"tab-size: 8\" id=\"gist97065476\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n      <div class=\"gist-data\">\n        \n<div class=\"js-gist-file-update-container js-task-list-container\">\n      <div id=\"file-smawk-cpp\" class=\"file my-2\">\n    \n    <div itemprop=\"text\"\n      class=\"Box-body p-0 blob-wrapper data type-c  \"\n      style=\"overflow: auto\" tabindex=\"0\" role=\"region\"\n      aria-label=\"smawk.cpp content, created by dstein64 on 12:34AM on July 05, 2019.\"\n    >\n\n        \n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n\n  <template class=\"js-file-alert-template\">\n  <div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n    <span>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a>\n    <\/span>\n\n\n  <div data-view-component=\"true\" class=\"flash-action\">        <a href=\"{{ revealButtonHref }}\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters\n<\/a>\n<\/div>\n<\/div><\/template>\n<template class=\"js-line-alert-template\">\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\">\n    <svg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg>\n<\/span><\/template>\n\n  <table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"smawk.cpp\">\n        <tr>\n          <td id=\"file-smawk-cpp-L1\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"1\"><\/td>\n          <td id=\"file-smawk-cpp-LC1\" class=\"blob-code blob-code-inner js-file-line\">#include &lt;functional&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L2\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"2\"><\/td>\n          <td id=\"file-smawk-cpp-LC2\" class=\"blob-code blob-code-inner js-file-line\">#include &lt;iostream&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L3\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"3\"><\/td>\n          <td id=\"file-smawk-cpp-LC3\" class=\"blob-code blob-code-inner js-file-line\">#include &lt;numeric&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L4\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"4\"><\/td>\n          <td id=\"file-smawk-cpp-LC4\" class=\"blob-code blob-code-inner js-file-line\">#include &lt;vector&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L5\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"5\"><\/td>\n          <td id=\"file-smawk-cpp-LC5\" class=\"blob-code blob-code-inner js-file-line\">#include &lt;unordered_map&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L6\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"6\"><\/td>\n          <td id=\"file-smawk-cpp-LC6\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L7\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"7\"><\/td>\n          <td id=\"file-smawk-cpp-LC7\" class=\"blob-code blob-code-inner js-file-line\">using namespace std;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L8\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"8\"><\/td>\n          <td id=\"file-smawk-cpp-LC8\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L9\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"9\"><\/td>\n          <td id=\"file-smawk-cpp-LC9\" class=\"blob-code blob-code-inner js-file-line\">typedef unsigned long ulong;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L10\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"10\"><\/td>\n          <td id=\"file-smawk-cpp-LC10\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L11\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"11\"><\/td>\n          <td id=\"file-smawk-cpp-LC11\" class=\"blob-code blob-code-inner js-file-line\">\/*<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L12\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"12\"><\/td>\n          <td id=\"file-smawk-cpp-LC12\" class=\"blob-code blob-code-inner js-file-line\"> *  Internal implementation of the SMAWK algorithm.<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L13\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"13\"><\/td>\n          <td id=\"file-smawk-cpp-LC13\" class=\"blob-code blob-code-inner js-file-line\"> *\/<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L14\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"14\"><\/td>\n          <td id=\"file-smawk-cpp-LC14\" class=\"blob-code blob-code-inner js-file-line\">template &lt;typename T&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L15\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"15\"><\/td>\n          <td id=\"file-smawk-cpp-LC15\" class=\"blob-code blob-code-inner js-file-line\">void _smawk(<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L16\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"16\"><\/td>\n          <td id=\"file-smawk-cpp-LC16\" class=\"blob-code blob-code-inner js-file-line\">        const vector&lt;ulong&gt;&amp; rows,<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L17\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"17\"><\/td>\n          <td id=\"file-smawk-cpp-LC17\" class=\"blob-code blob-code-inner js-file-line\">        const vector&lt;ulong&gt;&amp; cols,<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L18\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"18\"><\/td>\n          <td id=\"file-smawk-cpp-LC18\" class=\"blob-code blob-code-inner js-file-line\">        const function&lt;T(ulong, ulong)&gt;&amp; lookup,<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L19\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"19\"><\/td>\n          <td id=\"file-smawk-cpp-LC19\" class=\"blob-code blob-code-inner js-file-line\">        vector&lt;ulong&gt;* result) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L20\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"20\"><\/td>\n          <td id=\"file-smawk-cpp-LC20\" class=\"blob-code blob-code-inner js-file-line\">    \/\/ Recursion base case<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L21\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"21\"><\/td>\n          <td id=\"file-smawk-cpp-LC21\" class=\"blob-code blob-code-inner js-file-line\">    if (rows.size() == 0) return;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L22\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"22\"><\/td>\n          <td id=\"file-smawk-cpp-LC22\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L23\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"23\"><\/td>\n          <td id=\"file-smawk-cpp-LC23\" class=\"blob-code blob-code-inner js-file-line\">    \/\/ ********************************<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L24\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"24\"><\/td>\n          <td id=\"file-smawk-cpp-LC24\" class=\"blob-code blob-code-inner js-file-line\">    \/\/ * REDUCE<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L25\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"25\"><\/td>\n          <td id=\"file-smawk-cpp-LC25\" class=\"blob-code blob-code-inner js-file-line\">    \/\/ ********************************<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L26\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"26\"><\/td>\n          <td id=\"file-smawk-cpp-LC26\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L27\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"27\"><\/td>\n          <td id=\"file-smawk-cpp-LC27\" class=\"blob-code blob-code-inner js-file-line\">    vector&lt;ulong&gt; _cols;  \/\/ Stack of surviving columns<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L28\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"28\"><\/td>\n          <td id=\"file-smawk-cpp-LC28\" class=\"blob-code blob-code-inner js-file-line\">    for (ulong col : cols) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L29\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"29\"><\/td>\n          <td id=\"file-smawk-cpp-LC29\" class=\"blob-code blob-code-inner js-file-line\">        while (true) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L30\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"30\"><\/td>\n          <td id=\"file-smawk-cpp-LC30\" class=\"blob-code blob-code-inner js-file-line\">            if (_cols.size() == 0) break;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L31\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"31\"><\/td>\n          <td id=\"file-smawk-cpp-LC31\" class=\"blob-code blob-code-inner js-file-line\">            ulong row = rows[_cols.size() &#8211; 1];<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L32\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"32\"><\/td>\n          <td id=\"file-smawk-cpp-LC32\" class=\"blob-code blob-code-inner js-file-line\">            if (lookup(row, col) &gt;= lookup(row, _cols.back()))<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L33\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"33\"><\/td>\n          <td id=\"file-smawk-cpp-LC33\" class=\"blob-code blob-code-inner js-file-line\">                break;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L34\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"34\"><\/td>\n          <td id=\"file-smawk-cpp-LC34\" class=\"blob-code blob-code-inner js-file-line\">            _cols.pop_back();<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L35\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"35\"><\/td>\n          <td id=\"file-smawk-cpp-LC35\" class=\"blob-code blob-code-inner js-file-line\">        }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L36\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"36\"><\/td>\n          <td id=\"file-smawk-cpp-LC36\" class=\"blob-code blob-code-inner js-file-line\">        if (_cols.size() &lt; rows.size())<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L37\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"37\"><\/td>\n          <td id=\"file-smawk-cpp-LC37\" class=\"blob-code blob-code-inner js-file-line\">            _cols.push_back(col);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L38\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"38\"><\/td>\n          <td id=\"file-smawk-cpp-LC38\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L39\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"39\"><\/td>\n          <td id=\"file-smawk-cpp-LC39\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L40\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"40\"><\/td>\n          <td id=\"file-smawk-cpp-LC40\" class=\"blob-code blob-code-inner js-file-line\">    \/\/ Call recursively on odd-indexed rows<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L41\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"41\"><\/td>\n          <td id=\"file-smawk-cpp-LC41\" class=\"blob-code blob-code-inner js-file-line\">    vector&lt;ulong&gt; odd_rows;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L42\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"42\"><\/td>\n          <td id=\"file-smawk-cpp-LC42\" class=\"blob-code blob-code-inner js-file-line\">    for (ulong i = 1; i &lt; rows.size(); i += 2) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L43\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"43\"><\/td>\n          <td id=\"file-smawk-cpp-LC43\" class=\"blob-code blob-code-inner js-file-line\">        odd_rows.push_back(rows[i]);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L44\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"44\"><\/td>\n          <td id=\"file-smawk-cpp-LC44\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L45\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"45\"><\/td>\n          <td id=\"file-smawk-cpp-LC45\" class=\"blob-code blob-code-inner js-file-line\">    _smawk(odd_rows, _cols, lookup, result);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L46\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"46\"><\/td>\n          <td id=\"file-smawk-cpp-LC46\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L47\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"47\"><\/td>\n          <td id=\"file-smawk-cpp-LC47\" class=\"blob-code blob-code-inner js-file-line\">    unordered_map&lt;ulong, ulong&gt; col_idx_lookup;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L48\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"48\"><\/td>\n          <td id=\"file-smawk-cpp-LC48\" class=\"blob-code blob-code-inner js-file-line\">    for (ulong idx = 0; idx &lt; _cols.size(); ++idx) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L49\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"49\"><\/td>\n          <td id=\"file-smawk-cpp-LC49\" class=\"blob-code blob-code-inner js-file-line\">        col_idx_lookup[_cols[idx]] = idx;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L50\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"50\"><\/td>\n          <td id=\"file-smawk-cpp-LC50\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L51\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"51\"><\/td>\n          <td id=\"file-smawk-cpp-LC51\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L52\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"52\"><\/td>\n          <td id=\"file-smawk-cpp-LC52\" class=\"blob-code blob-code-inner js-file-line\">    \/\/ ********************************<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L53\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"53\"><\/td>\n          <td id=\"file-smawk-cpp-LC53\" class=\"blob-code blob-code-inner js-file-line\">    \/\/ * INTERPOLATE<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L54\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"54\"><\/td>\n          <td id=\"file-smawk-cpp-LC54\" class=\"blob-code blob-code-inner js-file-line\">    \/\/ ********************************<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L55\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"55\"><\/td>\n          <td id=\"file-smawk-cpp-LC55\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L56\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"56\"><\/td>\n          <td id=\"file-smawk-cpp-LC56\" class=\"blob-code blob-code-inner js-file-line\">    \/\/ Fill-in even-indexed rows<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L57\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"57\"><\/td>\n          <td id=\"file-smawk-cpp-LC57\" class=\"blob-code blob-code-inner js-file-line\">    ulong start = 0;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L58\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"58\"><\/td>\n          <td id=\"file-smawk-cpp-LC58\" class=\"blob-code blob-code-inner js-file-line\">    for (ulong r = 0; r &lt; rows.size(); r += 2) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L59\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"59\"><\/td>\n          <td id=\"file-smawk-cpp-LC59\" class=\"blob-code blob-code-inner js-file-line\">        ulong row = rows[r];<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L60\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"60\"><\/td>\n          <td id=\"file-smawk-cpp-LC60\" class=\"blob-code blob-code-inner js-file-line\">        ulong stop = _cols.size() &#8211; 1;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L61\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"61\"><\/td>\n          <td id=\"file-smawk-cpp-LC61\" class=\"blob-code blob-code-inner js-file-line\">        if (r &lt; rows.size() &#8211; 1)<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L62\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"62\"><\/td>\n          <td id=\"file-smawk-cpp-LC62\" class=\"blob-code blob-code-inner js-file-line\">            stop = col_idx_lookup[(*result)[rows[r + 1]]];<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L63\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"63\"><\/td>\n          <td id=\"file-smawk-cpp-LC63\" class=\"blob-code blob-code-inner js-file-line\">        ulong argmin = _cols[start];<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L64\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"64\"><\/td>\n          <td id=\"file-smawk-cpp-LC64\" class=\"blob-code blob-code-inner js-file-line\">        T min = lookup(row, argmin);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L65\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"65\"><\/td>\n          <td id=\"file-smawk-cpp-LC65\" class=\"blob-code blob-code-inner js-file-line\">        for (ulong c = start + 1; c &lt;= stop; ++c) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L66\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"66\"><\/td>\n          <td id=\"file-smawk-cpp-LC66\" class=\"blob-code blob-code-inner js-file-line\">            T value = lookup(row, _cols[c]);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L67\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"67\"><\/td>\n          <td id=\"file-smawk-cpp-LC67\" class=\"blob-code blob-code-inner js-file-line\">            if (c == start || value &lt; min) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L68\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"68\"><\/td>\n          <td id=\"file-smawk-cpp-LC68\" class=\"blob-code blob-code-inner js-file-line\">                argmin = _cols[c];<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L69\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"69\"><\/td>\n          <td id=\"file-smawk-cpp-LC69\" class=\"blob-code blob-code-inner js-file-line\">                min = value;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L70\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"70\"><\/td>\n          <td id=\"file-smawk-cpp-LC70\" class=\"blob-code blob-code-inner js-file-line\">            }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L71\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"71\"><\/td>\n          <td id=\"file-smawk-cpp-LC71\" class=\"blob-code blob-code-inner js-file-line\">        }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L72\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"72\"><\/td>\n          <td id=\"file-smawk-cpp-LC72\" class=\"blob-code blob-code-inner js-file-line\">        (*result)[row] = argmin;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L73\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"73\"><\/td>\n          <td id=\"file-smawk-cpp-LC73\" class=\"blob-code blob-code-inner js-file-line\">        start = stop;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L74\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"74\"><\/td>\n          <td id=\"file-smawk-cpp-LC74\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L75\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"75\"><\/td>\n          <td id=\"file-smawk-cpp-LC75\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L76\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"76\"><\/td>\n          <td id=\"file-smawk-cpp-LC76\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L77\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"77\"><\/td>\n          <td id=\"file-smawk-cpp-LC77\" class=\"blob-code blob-code-inner js-file-line\">\/*<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L78\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"78\"><\/td>\n          <td id=\"file-smawk-cpp-LC78\" class=\"blob-code blob-code-inner js-file-line\"> *  Interface for the SMAWK algorithm, for finding the minimum value<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L79\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"79\"><\/td>\n          <td id=\"file-smawk-cpp-LC79\" class=\"blob-code blob-code-inner js-file-line\"> *  in each row of an implicitly-defined totally monotone matrix.<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L80\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"80\"><\/td>\n          <td id=\"file-smawk-cpp-LC80\" class=\"blob-code blob-code-inner js-file-line\"> *\/<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L81\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"81\"><\/td>\n          <td id=\"file-smawk-cpp-LC81\" class=\"blob-code blob-code-inner js-file-line\">template &lt;typename T&gt;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L82\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"82\"><\/td>\n          <td id=\"file-smawk-cpp-LC82\" class=\"blob-code blob-code-inner js-file-line\">vector&lt;ulong&gt; smawk(<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L83\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"83\"><\/td>\n          <td id=\"file-smawk-cpp-LC83\" class=\"blob-code blob-code-inner js-file-line\">        const ulong num_rows,<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L84\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"84\"><\/td>\n          <td id=\"file-smawk-cpp-LC84\" class=\"blob-code blob-code-inner js-file-line\">        const ulong num_cols,<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L85\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"85\"><\/td>\n          <td id=\"file-smawk-cpp-LC85\" class=\"blob-code blob-code-inner js-file-line\">        const function&lt;T(ulong, ulong)&gt;&amp; lookup) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L86\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"86\"><\/td>\n          <td id=\"file-smawk-cpp-LC86\" class=\"blob-code blob-code-inner js-file-line\">    vector&lt;ulong&gt; result;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L87\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"87\"><\/td>\n          <td id=\"file-smawk-cpp-LC87\" class=\"blob-code blob-code-inner js-file-line\">    result.resize(num_rows);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L88\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"88\"><\/td>\n          <td id=\"file-smawk-cpp-LC88\" class=\"blob-code blob-code-inner js-file-line\">    vector&lt;ulong&gt; rows(num_rows);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L89\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"89\"><\/td>\n          <td id=\"file-smawk-cpp-LC89\" class=\"blob-code blob-code-inner js-file-line\">    iota(begin(rows), end(rows), 0);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L90\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"90\"><\/td>\n          <td id=\"file-smawk-cpp-LC90\" class=\"blob-code blob-code-inner js-file-line\">    vector&lt;ulong&gt; cols(num_cols);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L91\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"91\"><\/td>\n          <td id=\"file-smawk-cpp-LC91\" class=\"blob-code blob-code-inner js-file-line\">    iota(begin(cols), end(cols), 0);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L92\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"92\"><\/td>\n          <td id=\"file-smawk-cpp-LC92\" class=\"blob-code blob-code-inner js-file-line\">    _smawk&lt;T&gt;(rows, cols, lookup, &amp;result);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L93\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"93\"><\/td>\n          <td id=\"file-smawk-cpp-LC93\" class=\"blob-code blob-code-inner js-file-line\">    return result;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L94\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"94\"><\/td>\n          <td id=\"file-smawk-cpp-LC94\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L95\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"95\"><\/td>\n          <td id=\"file-smawk-cpp-LC95\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L96\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"96\"><\/td>\n          <td id=\"file-smawk-cpp-LC96\" class=\"blob-code blob-code-inner js-file-line\">#define NUM_ROWS 9<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L97\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"97\"><\/td>\n          <td id=\"file-smawk-cpp-LC97\" class=\"blob-code blob-code-inner js-file-line\">#define NUM_COLS 18<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L98\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"98\"><\/td>\n          <td id=\"file-smawk-cpp-LC98\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L99\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"99\"><\/td>\n          <td id=\"file-smawk-cpp-LC99\" class=\"blob-code blob-code-inner js-file-line\">\/\/ SMAWK works on implicitly defined matrices, utilizing a function<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L100\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"100\"><\/td>\n          <td id=\"file-smawk-cpp-LC100\" class=\"blob-code blob-code-inner js-file-line\">\/\/ that returns a value as a function of matrix indices.<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L101\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"101\"><\/td>\n          <td id=\"file-smawk-cpp-LC101\" class=\"blob-code blob-code-inner js-file-line\">\/\/ An explicitly defined matrix is used here for the purpose of<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L102\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"102\"><\/td>\n          <td id=\"file-smawk-cpp-LC102\" class=\"blob-code blob-code-inner js-file-line\">\/\/ illustration.<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L103\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"103\"><\/td>\n          <td id=\"file-smawk-cpp-LC103\" class=\"blob-code blob-code-inner js-file-line\">\/\/ The matrix is from:<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L104\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"104\"><\/td>\n          <td id=\"file-smawk-cpp-LC104\" class=\"blob-code blob-code-inner js-file-line\">\/\/   http:\/\/web.cs.unlv.edu\/larmore\/Courses\/CSC477\/monge.pdf.<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L105\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"105\"><\/td>\n          <td id=\"file-smawk-cpp-LC105\" class=\"blob-code blob-code-inner js-file-line\">double matrix[NUM_ROWS][NUM_COLS] = {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L106\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"106\"><\/td>\n          <td id=\"file-smawk-cpp-LC106\" class=\"blob-code blob-code-inner js-file-line\">    { 25, 21, 13,10,20,13,19,35,37,41,58,66,82,99,124,133,156,178},<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L107\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"107\"><\/td>\n          <td id=\"file-smawk-cpp-LC107\" class=\"blob-code blob-code-inner js-file-line\">    { 42, 35, 26,20,29,21,25,37,36,39,56,64,76,91,116,125,146,164},<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L108\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"108\"><\/td>\n          <td id=\"file-smawk-cpp-LC108\" class=\"blob-code blob-code-inner js-file-line\">    { 57, 48, 35,28,33,24,28,40,37,37,54,61,72,83,107,113,131,146},<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L109\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"109\"><\/td>\n          <td id=\"file-smawk-cpp-LC109\" class=\"blob-code blob-code-inner js-file-line\">    { 78, 65, 51,42,44,35,38,48,42,42,55,61,70,80,100,106,120,135},<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L110\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"110\"><\/td>\n          <td id=\"file-smawk-cpp-LC110\" class=\"blob-code blob-code-inner js-file-line\">    { 90, 76, 58,48,49,39,42,48,39,35,47,51,56,63, 80, 86, 97,110},<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L111\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"111\"><\/td>\n          <td id=\"file-smawk-cpp-LC111\" class=\"blob-code blob-code-inner js-file-line\">    {103, 85, 67,56,55,44,44,49,39,33,41,44,49,56, 71, 75, 84, 96},<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L112\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"112\"><\/td>\n          <td id=\"file-smawk-cpp-LC112\" class=\"blob-code blob-code-inner js-file-line\">    {123,105, 86,75,73,59,57,62,51,44,50,52,55,59, 72, 74, 80, 92},<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L113\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"113\"><\/td>\n          <td id=\"file-smawk-cpp-LC113\" class=\"blob-code blob-code-inner js-file-line\">    {142,123,100,86,82,65,61,62,50,43,47,45,46,46, 58, 59, 65, 73},<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L114\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"114\"><\/td>\n          <td id=\"file-smawk-cpp-LC114\" class=\"blob-code blob-code-inner js-file-line\">    {151,130,104,88,80,59,52,49,37,29,29,24,23,20, 28, 25, 31, 39},<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L115\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"115\"><\/td>\n          <td id=\"file-smawk-cpp-LC115\" class=\"blob-code blob-code-inner js-file-line\">};<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L116\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"116\"><\/td>\n          <td id=\"file-smawk-cpp-LC116\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L117\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"117\"><\/td>\n          <td id=\"file-smawk-cpp-LC117\" class=\"blob-code blob-code-inner js-file-line\">int main(void) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L118\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"118\"><\/td>\n          <td id=\"file-smawk-cpp-LC118\" class=\"blob-code blob-code-inner js-file-line\">    auto lookup = [](ulong i,ulong j) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L119\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"119\"><\/td>\n          <td id=\"file-smawk-cpp-LC119\" class=\"blob-code blob-code-inner js-file-line\">        return matrix[i][j];<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L120\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"120\"><\/td>\n          <td id=\"file-smawk-cpp-LC120\" class=\"blob-code blob-code-inner js-file-line\">    };<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L121\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"121\"><\/td>\n          <td id=\"file-smawk-cpp-LC121\" class=\"blob-code blob-code-inner js-file-line\">    vector&lt;ulong&gt; argmin = smawk&lt;double&gt;(NUM_ROWS, NUM_COLS, lookup);<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L122\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"122\"><\/td>\n          <td id=\"file-smawk-cpp-LC122\" class=\"blob-code blob-code-inner js-file-line\">    for (ulong i = 0; i &lt; argmin.size(); ++i) {<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L123\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"123\"><\/td>\n          <td id=\"file-smawk-cpp-LC123\" class=\"blob-code blob-code-inner js-file-line\">        cout &lt;&lt; argmin[i] &lt;&lt; endl;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L124\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"124\"><\/td>\n          <td id=\"file-smawk-cpp-LC124\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L125\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"125\"><\/td>\n          <td id=\"file-smawk-cpp-LC125\" class=\"blob-code blob-code-inner js-file-line\">    return 0;<\/td>\n        <\/tr>\n        <tr>\n          <td id=\"file-smawk-cpp-L126\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"126\"><\/td>\n          <td id=\"file-smawk-cpp-LC126\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n        <\/tr>\n  <\/table>\n<\/div>\n\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n      <\/div>\n      <div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/dstein64\/8e94a6a25efc1335657e910ff525f405\/raw\/c7254100bca4d555bdf1e21ce037c140faa40e7a\/smawk.cpp\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a>\n        <a href=\"https:\/\/gist.github.com\/dstein64\/8e94a6a25efc1335657e910ff525f405#file-smawk-cpp\" class=\"Link--inTextBlock\">\n          smawk.cpp\n        <\/a>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n    <\/div>\n<\/div>\n<\/p>\n\n\n<p><strong><span style=\"text-decoration: underline;\">References<\/span><\/strong><\/p>\n\n\n\n<p>Aggarwal, Alok, Maria M. Klawe, Shlomo Moran, Peter Shor, and Robert Wilber. \u201cGeometric Applications of a Matrix-Searching Algorithm.\u201d Algorithmica 2, no. 1 (November 1, 1987): 195\u2013208.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I recently implemented kmeans1d\u2014discussed in a prior post\u2014for efficiently performing globally optimal 1D k-means clustering. The implementation utilizes the SMAWK algorithm (Aggarwal et al., 1987), which calculates argmin(i) for each row i of an arbitrary n \u00d7 m totally monotone matrix, in O(m(1 + lg(n\/m))). I&#8217;ve factored out my SMAWK C++ code into the example [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[77,69,68],"class_list":["post-25910","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-c","tag-computer-science","tag-smawk"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1sCC6-6JU","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/posts\/25910","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/comments?post=25910"}],"version-history":[{"count":15,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/posts\/25910\/revisions"}],"predecessor-version":[{"id":25999,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/posts\/25910\/revisions\/25999"}],"wp:attachment":[{"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/media?parent=25910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/categories?post=25910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dannyadam.com\/blog\/wp-json\/wp\/v2\/tags?post=25910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}