On Optimally Partitioning Variable-Byte Index Data Giulio Ermanno - - PowerPoint PPT Presentation

on optimally partitioning variable byte index data
SMART_READER_LITE
LIVE PREVIEW

On Optimally Partitioning Variable-Byte Index Data Giulio Ermanno - - PowerPoint PPT Presentation

On Optimally Partitioning Variable-Byte Index Data Giulio Ermanno Pibiri Rossano Venturini University of Pisa and ISTI-CNR University of Pisa and ISTI-CNR Pisa, Italy Pisa, Italy giulio.pibiri@di.unipi.it rossano.venturini@unipi.it


slide-1
SLIDE 1

On Optimally Partitioning Variable-Byte Index Data

Melbourne, 17/05/2018

1

Rossano Venturini

University of Pisa and ISTI-CNR Pisa, Italy rossano.venturini@unipi.it

Giulio Ermanno Pibiri

University of Pisa and ISTI-CNR Pisa, Italy giulio.pibiri@di.unipi.it

slide-2
SLIDE 2

Context - Inverted Indexes

We focus on compression effectiveness and retrieval speed in inverted indexes.

The inverted index is the de-facto data structure at the basis of every large-scale retrieval system.

2

slide-3
SLIDE 3

Context - Inverted Indexes

We focus on compression effectiveness and retrieval speed in inverted indexes.

house is red red is always good the the is boy hungry is boy red house is the always hungry

The inverted index is the de-facto data structure at the basis of every large-scale retrieval system.

2

slide-4
SLIDE 4

Context - Inverted Indexes

We focus on compression effectiveness and retrieval speed in inverted indexes.

house is red red is always good the the is boy hungry is boy red house is the always hungry

T = {always, boy, good, house, hungry, is, red, the}

t1 t2 t3 t4 t5 t6 t7 t8

The inverted index is the de-facto data structure at the basis of every large-scale retrieval system.

2

slide-5
SLIDE 5

Context - Inverted Indexes

We focus on compression effectiveness and retrieval speed in inverted indexes.

house is red red is always good the the is boy hungry is boy red house is the always hungry

2 1 3 4 5

T = {always, boy, good, house, hungry, is, red, the}

t1 t2 t3 t4 t5 t6 t7 t8

The inverted index is the de-facto data structure at the basis of every large-scale retrieval system.

2

slide-6
SLIDE 6

Context - Inverted Indexes

We focus on compression effectiveness and retrieval speed in inverted indexes.

house is red red is always good the the is boy hungry is boy red house is the always hungry

2 1 3 4 5

T = {always, boy, good, house, hungry, is, red, the}

t1 t2 t3 t4 t5 t6 t7 t8

Lt1=[1, 3] Lt2=[4, 5] Lt3=[1] Lt4=[2, 3] Lt5=[3, 5] Lt6=[1, 2, 3, 4, 5] Lt7=[1, 2, 4] Lt8=[2, 3, 5]

The inverted index is the de-facto data structure at the basis of every large-scale retrieval system.

2

slide-7
SLIDE 7

Context - Inverted Indexes

We focus on compression effectiveness and retrieval speed in inverted indexes.

house is red red is always good the the is boy hungry is boy red house is the always hungry

2 1 3 4 5

T = {always, boy, good, house, hungry, is, red, the}

t1 t2 t3 t4 t5 t6 t7 t8

Lt1=[1, 3] Lt2=[4, 5] Lt3=[1] Lt4=[2, 3] Lt5=[3, 5] Lt6=[1, 2, 3, 4, 5] Lt7=[1, 2, 4] Lt8=[2, 3, 5]

The inverted index is the de-facto data structure at the basis of every large-scale retrieval system.

2

slide-8
SLIDE 8

3

Context - Inverted Indexes

Inverted Indexes owe their popularity to the efficient resolution of queries, such as: “return all documents in which terms {t1,…,tk} occur”.

slide-9
SLIDE 9

3

Context - Inverted Indexes

Inverted Indexes owe their popularity to the efficient resolution of queries, such as: “return all documents in which terms {t1,…,tk} occur”.

house is red red is always good the the is boy hungry is boy red house is the always hungry

T = {always, boy, good, house, hungry, is, red, the}

2 1 3 4 5

Lt1=[1, 3]

t1 t2 t3 t4 t5 t6 t7 t8

Lt2=[4, 5] Lt3=[1] Lt4=[2, 3] Lt5=[3, 5] Lt6=[1, 2, 3, 4, 5] Lt7=[1, 2, 4] Lt8=[2, 3, 5]

slide-10
SLIDE 10

3

Context - Inverted Indexes

Inverted Indexes owe their popularity to the efficient resolution of queries, such as: “return all documents in which terms {t1,…,tk} occur”.

q = {boy, is, the}

house is red red is always good the the is boy hungry is boy red house is the always hungry

T = {always, boy, good, house, hungry, is, red, the}

2 1 3 4 5

Lt1=[1, 3]

t1 t2 t3 t4 t5 t6 t7 t8

Lt2=[4, 5] Lt3=[1] Lt4=[2, 3] Lt5=[3, 5] Lt6=[1, 2, 3, 4, 5] Lt7=[1, 2, 4] Lt8=[2, 3, 5]

slide-11
SLIDE 11

3

Context - Inverted Indexes

Inverted Indexes owe their popularity to the efficient resolution of queries, such as: “return all documents in which terms {t1,…,tk} occur”.

q = {boy, is, the}

house is red red is always good the the is boy hungry is boy red house is the always hungry

T = {always, boy, good, house, hungry, is, red, the}

2 1 3 4 5

Lt1=[1, 3]

t1 t2 t3 t4 t5 t6 t7 t8

Lt2=[4, 5] Lt3=[1] Lt4=[2, 3] Lt5=[3, 5] Lt6=[1, 2, 3, 4, 5] Lt7=[1, 2, 4] Lt8=[2, 3, 5]

slide-12
SLIDE 12

3

Context - Inverted Indexes

Inverted Indexes owe their popularity to the efficient resolution of queries, such as: “return all documents in which terms {t1,…,tk} occur”.

q = {boy, is, the}

house is red red is always good the the is boy hungry is boy red house is the always hungry

T = {always, boy, good, house, hungry, is, red, the}

2 1 3 4 5

Lt1=[1, 3]

t1 t2 t3 t4 t5 t6 t7 t8

Lt2=[4, 5] Lt3=[1] Lt4=[2, 3] Lt5=[3, 5] Lt6=[1, 2, 3, 4, 5] Lt7=[1, 2, 4] Lt8=[2, 3, 5]

slide-13
SLIDE 13

3

Context - Inverted Indexes

Inverted Indexes owe their popularity to the efficient resolution of queries, such as: “return all documents in which terms {t1,…,tk} occur”.

q = {boy, is, the}

house is red red is always good the the is boy hungry is boy red house is the always hungry

T = {always, boy, good, house, hungry, is, red, the}

2 1 3 4 5

Lt1=[1, 3]

t1 t2 t3 t4 t5 t6 t7 t8

Lt2=[4, 5] Lt3=[1] Lt4=[2, 3] Lt5=[3, 5] Lt6=[1, 2, 3, 4, 5] Lt7=[1, 2, 4] Lt8=[2, 3, 5] q = {good, hungry}

slide-14
SLIDE 14

3

Context - Inverted Indexes

Inverted Indexes owe their popularity to the efficient resolution of queries, such as: “return all documents in which terms {t1,…,tk} occur”.

q = {boy, is, the}

house is red red is always good the the is boy hungry is boy red house is the always hungry

T = {always, boy, good, house, hungry, is, red, the}

2 1 3 4 5

Lt1=[1, 3]

t1 t2 t3 t4 t5 t6 t7 t8

Lt2=[4, 5] Lt3=[1] Lt4=[2, 3] Lt5=[3, 5] Lt6=[1, 2, 3, 4, 5] Lt7=[1, 2, 4] Lt8=[2, 3, 5] q = {good, hungry}

slide-15
SLIDE 15

3

Context - Inverted Indexes

Inverted Indexes owe their popularity to the efficient resolution of queries, such as: “return all documents in which terms {t1,…,tk} occur”.

q = {boy, is, the}

house is red red is always good the the is boy hungry is boy red house is the always hungry

T = {always, boy, good, house, hungry, is, red, the}

2 1 3 4 5

Lt1=[1, 3]

t1 t2 t3 t4 t5 t6 t7 t8

Lt2=[4, 5] Lt3=[1] Lt4=[2, 3] Lt5=[3, 5] Lt6=[1, 2, 3, 4, 5] Lt7=[1, 2, 4] Lt8=[2, 3, 5] q = {good, hungry}

slide-16
SLIDE 16

Huge research corpora describing different space/time trade-offs.

  • Elias gamma/delta
  • Variable-Byte
  • Binary Interpolative Coding
  • Simple-9/16
  • PForDelta

Many solutions

  • Optimized PForDelta
  • Elias-Fano
  • Partitioned Elias-Fano
  • Clustered Elias-Fano
  • Asymmetric Numeral Systems

4

slide-17
SLIDE 17

Huge research corpora describing different space/time trade-offs.

  • Elias gamma/delta
  • Variable-Byte
  • Binary Interpolative Coding
  • Simple-9/16
  • PForDelta

Many solutions

  • Optimized PForDelta
  • Elias-Fano
  • Partitioned Elias-Fano
  • Clustered Elias-Fano
  • Asymmetric Numeral Systems

4

Binary Interpolative Coding Variable-Byte
 (VByte) Family

Space Time Spectrum ~3X smaller ~4.5X faster

slide-18
SLIDE 18

5

Our research question

Can we improve the space of a VByte-encoded sequence and preserve its query processing speed?

slide-19
SLIDE 19

6

Variable-Byte Encoding

Simple idea: encode each number using as few bytes as possible.

6 10000110 127 11111111 128 1000000100000000 100001001000000101111110 65790

slide-20
SLIDE 20

6

Variable-Byte Encoding

Simple idea: encode each number using as few bytes as possible.

6 10000110 127 11111111 128 1000000100000000 100001001000000101111110 65790

Decoding is fast: keep reading bytes until you hit a value smaller than 128.

SIMD (Single Instruction Multiple Data)

slide-21
SLIDE 21

7

So…what’s “wrong” with VByte?

The majority of values are small (very small indeed). VByte needs at least 8 bits per integer (bpi).

slide-22
SLIDE 22

7

So…what’s “wrong” with VByte?

The majority of values are small (very small indeed). VByte needs at least 8 bits per integer (bpi).

Sensibly far away from bit-level effectiveness.
 BIC: 3.8 bpi on Gov2
 PEF: 4.1 bpi on Gov2

slide-23
SLIDE 23

8

High-level idea

  • 1. Partition each inverted list into variable-length

partitions.

  • 2. Encode dense partitions with their

characteristic bitvector.

  • 3. Encode sparse partitions with VByte.
slide-24
SLIDE 24

8

High-level idea

  • 1. Partition each inverted list into variable-length

partitions.

  • 2. Encode dense partitions with their

characteristic bitvector.

  • 3. Encode sparse partitions with VByte.

[13, 15, 16, 17, 20, 21, 23, 24] 1 0 1 1 1 0 0 1 1 0 1 1

13 14 15 16 17 18 19 20 21 22 23 24

24 - 13 - 1 = 12 bits VS 64 bits (5.33X)

slide-25
SLIDE 25

9

Computing an optimal partition

1st level 2nd level n

slide-26
SLIDE 26

9

Computing an optimal partition

1st level 2nd level n

Stores a fixed amount to bits, say F, for each partition.

slide-27
SLIDE 27

9

Computing an optimal partition

1st level 2nd level n

Dynamic Programming (DP)

Optimal

guarantee

Stores a fixed amount to bits, say F, for each partition.

slide-28
SLIDE 28

9

Computing an optimal partition

1st level 2nd level n

😒

Θ(n2)

<latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit><latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit><latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit><latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit>

O(n)

<latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit>

time space Dynamic Programming (DP)

Optimal

guarantee

Stores a fixed amount to bits, say F, for each partition.

slide-29
SLIDE 29

9

Computing an optimal partition

1st level 2nd level n

😁

DP Approximation

  • Optimal

O(n)

<latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit>

O(n log1+✏ 1/✏)

<latexit sha1_base64="6hVmX51F/0iLF5CM+4JFeLHkSRs=">ACXHicbVDLSgMxFE3Hd31VBTduokVQhDoRQZeiG3cqWBXaoWTS2xqaSYbkjliGrv0at/otbvwWM7WCrR64cDj3feJUSYdh+FEKpqZnZufmF8qLS8srq5W19TtnMiugLowy9iHmDpTUEeJCh5SCzyJFdzHvYsif/8E1kmjb7GfQpTwrpYdKTh6qVXZvtrTtKlMt5WzgyakTiqjB5Qd/vD9VqUa1sIh6F/CRqRKRrhurZWqzbYRWQIaheLONViYpRzi1IoGJSbmYOUix7vQsNTzRNwUT78ZUB3vdKmHWN9aKRD9XdHzhPn+knsKxOj24yV4j/5RoZdk6jXOo0Q9Die1EnUxQNLYyhbWlBoOp7woWV/lYqHrnlAr195bFRtyzKi+uKOWP7lYzBf6knpTIlRXhzFHcIzDsreVjZp4l9yd1RjY3dHFfPzkcGz5MtskP2CMn5IxckmtSJ4K8kFfyRt5Ln8F0sBgsf5cGpVHPBhlDsPkFG7G2WQ=</latexit><latexit sha1_base64="6hVmX51F/0iLF5CM+4JFeLHkSRs=">ACXHicbVDLSgMxFE3Hd31VBTduokVQhDoRQZeiG3cqWBXaoWTS2xqaSYbkjliGrv0at/otbvwWM7WCrR64cDj3feJUSYdh+FEKpqZnZufmF8qLS8srq5W19TtnMiugLowy9iHmDpTUEeJCh5SCzyJFdzHvYsif/8E1kmjb7GfQpTwrpYdKTh6qVXZvtrTtKlMt5WzgyakTiqjB5Qd/vD9VqUa1sIh6F/CRqRKRrhurZWqzbYRWQIaheLONViYpRzi1IoGJSbmYOUix7vQsNTzRNwUT78ZUB3vdKmHWN9aKRD9XdHzhPn+knsKxOj24yV4j/5RoZdk6jXOo0Q9Die1EnUxQNLYyhbWlBoOp7woWV/lYqHrnlAr195bFRtyzKi+uKOWP7lYzBf6knpTIlRXhzFHcIzDsreVjZp4l9yd1RjY3dHFfPzkcGz5MtskP2CMn5IxckmtSJ4K8kFfyRt5Ln8F0sBgsf5cGpVHPBhlDsPkFG7G2WQ=</latexit><latexit sha1_base64="6hVmX51F/0iLF5CM+4JFeLHkSRs=">ACXHicbVDLSgMxFE3Hd31VBTduokVQhDoRQZeiG3cqWBXaoWTS2xqaSYbkjliGrv0at/otbvwWM7WCrR64cDj3feJUSYdh+FEKpqZnZufmF8qLS8srq5W19TtnMiugLowy9iHmDpTUEeJCh5SCzyJFdzHvYsif/8E1kmjb7GfQpTwrpYdKTh6qVXZvtrTtKlMt5WzgyakTiqjB5Qd/vD9VqUa1sIh6F/CRqRKRrhurZWqzbYRWQIaheLONViYpRzi1IoGJSbmYOUix7vQsNTzRNwUT78ZUB3vdKmHWN9aKRD9XdHzhPn+knsKxOj24yV4j/5RoZdk6jXOo0Q9Die1EnUxQNLYyhbWlBoOp7woWV/lYqHrnlAr195bFRtyzKi+uKOWP7lYzBf6knpTIlRXhzFHcIzDsreVjZp4l9yd1RjY3dHFfPzkcGz5MtskP2CMn5IxckmtSJ4K8kFfyRt5Ln8F0sBgsf5cGpVHPBhlDsPkFG7G2WQ=</latexit><latexit sha1_base64="6hVmX51F/0iLF5CM+4JFeLHkSRs=">ACXHicbVDLSgMxFE3Hd31VBTduokVQhDoRQZeiG3cqWBXaoWTS2xqaSYbkjliGrv0at/otbvwWM7WCrR64cDj3feJUSYdh+FEKpqZnZufmF8qLS8srq5W19TtnMiugLowy9iHmDpTUEeJCh5SCzyJFdzHvYsif/8E1kmjb7GfQpTwrpYdKTh6qVXZvtrTtKlMt5WzgyakTiqjB5Qd/vD9VqUa1sIh6F/CRqRKRrhurZWqzbYRWQIaheLONViYpRzi1IoGJSbmYOUix7vQsNTzRNwUT78ZUB3vdKmHWN9aKRD9XdHzhPn+knsKxOj24yV4j/5RoZdk6jXOo0Q9Die1EnUxQNLYyhbWlBoOp7woWV/lYqHrnlAr195bFRtyzKi+uKOWP7lYzBf6knpTIlRXhzFHcIzDsreVjZp4l9yd1RjY3dHFfPzkcGz5MtskP2CMn5IxckmtSJ4K8kFfyRt5Ln8F0sBgsf5cGpVHPBhlDsPkFG7G2WQ=</latexit>

<latexit sha1_base64="tSF/2uVorul/Qm3kspCLi9j5+I=">ACQXicbVDLSsNAFJ34rPHV6tJNMAiuSiKCLotuXFboC9pQJtPbduhkEmZuxBL6E271b/wKP8GduHXjpM3Ctl64cDj3de4JE8E1et6HtbG5tb2zW9qz9w8Oj47LlZOWjlPFoMliEatOSDUILqGJHAV0EgU0CgW0w8l9Xm8/gdI8lg2cJhBEdCT5kDOKhur0INFcxLJfdr2qNw9nHfgFcEkR9X7FcnuDmKURSGSCat31vQSDjCrkTMDM7qUaEsomdARdAyWNQAfZXPDMuTDMwBnGyqREZ87+nchopPU0Ck1nRHGsV2s5+V+tm+LwNsi4TFIEyRaHhqlwMHby750BV8BQTA2gTHGj1WFjqihD45G9tKrhB1muLt+zdF/wEMyXcuVJjlRwFmS5KoRnFmG1v9VRPXQeuq6ntV/Hard0VBpfIGTknl8QnN6RGHkidNAkjgryQV/JmvVuf1pf1vWjdsIqZU7IU1s8vY6Sw1Q=</latexit><latexit sha1_base64="tSF/2uVorul/Qm3kspCLi9j5+I=">ACQXicbVDLSsNAFJ34rPHV6tJNMAiuSiKCLotuXFboC9pQJtPbduhkEmZuxBL6E271b/wKP8GduHXjpM3Ctl64cDj3de4JE8E1et6HtbG5tb2zW9qz9w8Oj47LlZOWjlPFoMliEatOSDUILqGJHAV0EgU0CgW0w8l9Xm8/gdI8lg2cJhBEdCT5kDOKhur0INFcxLJfdr2qNw9nHfgFcEkR9X7FcnuDmKURSGSCat31vQSDjCrkTMDM7qUaEsomdARdAyWNQAfZXPDMuTDMwBnGyqREZ87+nchopPU0Ck1nRHGsV2s5+V+tm+LwNsi4TFIEyRaHhqlwMHby750BV8BQTA2gTHGj1WFjqihD45G9tKrhB1muLt+zdF/wEMyXcuVJjlRwFmS5KoRnFmG1v9VRPXQeuq6ntV/Hard0VBpfIGTknl8QnN6RGHkidNAkjgryQV/JmvVuf1pf1vWjdsIqZU7IU1s8vY6Sw1Q=</latexit><latexit sha1_base64="tSF/2uVorul/Qm3kspCLi9j5+I=">ACQXicbVDLSsNAFJ34rPHV6tJNMAiuSiKCLotuXFboC9pQJtPbduhkEmZuxBL6E271b/wKP8GduHXjpM3Ctl64cDj3de4JE8E1et6HtbG5tb2zW9qz9w8Oj47LlZOWjlPFoMliEatOSDUILqGJHAV0EgU0CgW0w8l9Xm8/gdI8lg2cJhBEdCT5kDOKhur0INFcxLJfdr2qNw9nHfgFcEkR9X7FcnuDmKURSGSCat31vQSDjCrkTMDM7qUaEsomdARdAyWNQAfZXPDMuTDMwBnGyqREZ87+nchopPU0Ck1nRHGsV2s5+V+tm+LwNsi4TFIEyRaHhqlwMHby750BV8BQTA2gTHGj1WFjqihD45G9tKrhB1muLt+zdF/wEMyXcuVJjlRwFmS5KoRnFmG1v9VRPXQeuq6ntV/Hard0VBpfIGTknl8QnN6RGHkidNAkjgryQV/JmvVuf1pf1vWjdsIqZU7IU1s8vY6Sw1Q=</latexit><latexit sha1_base64="tSF/2uVorul/Qm3kspCLi9j5+I=">ACQXicbVDLSsNAFJ34rPHV6tJNMAiuSiKCLotuXFboC9pQJtPbduhkEmZuxBL6E271b/wKP8GduHXjpM3Ctl64cDj3de4JE8E1et6HtbG5tb2zW9qz9w8Oj47LlZOWjlPFoMliEatOSDUILqGJHAV0EgU0CgW0w8l9Xm8/gdI8lg2cJhBEdCT5kDOKhur0INFcxLJfdr2qNw9nHfgFcEkR9X7FcnuDmKURSGSCat31vQSDjCrkTMDM7qUaEsomdARdAyWNQAfZXPDMuTDMwBnGyqREZ87+nchopPU0Ck1nRHGsV2s5+V+tm+LwNsi4TFIEyRaHhqlwMHby750BV8BQTA2gTHGj1WFjqihD45G9tKrhB1muLt+zdF/wEMyXcuVJjlRwFmS5KoRnFmG1v9VRPXQeuq6ntV/Hard0VBpfIGTknl8QnN6RGHkidNAkjgryQV/JmvVuf1pf1vWjdsIqZU7IU1s8vY6Sw1Q=</latexit>

😒

Θ(n2)

<latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit><latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit><latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit><latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit>

O(n)

<latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit>

time space Dynamic Programming (DP)

Optimal

guarantee

Stores a fixed amount to bits, say F, for each partition.

slide-30
SLIDE 30

9

Computing an optimal partition

1st level 2nd level n

😁

DP Approximation

  • Optimal

O(n)

<latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit>

O(n log1+✏ 1/✏)

<latexit sha1_base64="6hVmX51F/0iLF5CM+4JFeLHkSRs=">ACXHicbVDLSgMxFE3Hd31VBTduokVQhDoRQZeiG3cqWBXaoWTS2xqaSYbkjliGrv0at/otbvwWM7WCrR64cDj3feJUSYdh+FEKpqZnZufmF8qLS8srq5W19TtnMiugLowy9iHmDpTUEeJCh5SCzyJFdzHvYsif/8E1kmjb7GfQpTwrpYdKTh6qVXZvtrTtKlMt5WzgyakTiqjB5Qd/vD9VqUa1sIh6F/CRqRKRrhurZWqzbYRWQIaheLONViYpRzi1IoGJSbmYOUix7vQsNTzRNwUT78ZUB3vdKmHWN9aKRD9XdHzhPn+knsKxOj24yV4j/5RoZdk6jXOo0Q9Die1EnUxQNLYyhbWlBoOp7woWV/lYqHrnlAr195bFRtyzKi+uKOWP7lYzBf6knpTIlRXhzFHcIzDsreVjZp4l9yd1RjY3dHFfPzkcGz5MtskP2CMn5IxckmtSJ4K8kFfyRt5Ln8F0sBgsf5cGpVHPBhlDsPkFG7G2WQ=</latexit><latexit sha1_base64="6hVmX51F/0iLF5CM+4JFeLHkSRs=">ACXHicbVDLSgMxFE3Hd31VBTduokVQhDoRQZeiG3cqWBXaoWTS2xqaSYbkjliGrv0at/otbvwWM7WCrR64cDj3feJUSYdh+FEKpqZnZufmF8qLS8srq5W19TtnMiugLowy9iHmDpTUEeJCh5SCzyJFdzHvYsif/8E1kmjb7GfQpTwrpYdKTh6qVXZvtrTtKlMt5WzgyakTiqjB5Qd/vD9VqUa1sIh6F/CRqRKRrhurZWqzbYRWQIaheLONViYpRzi1IoGJSbmYOUix7vQsNTzRNwUT78ZUB3vdKmHWN9aKRD9XdHzhPn+knsKxOj24yV4j/5RoZdk6jXOo0Q9Die1EnUxQNLYyhbWlBoOp7woWV/lYqHrnlAr195bFRtyzKi+uKOWP7lYzBf6knpTIlRXhzFHcIzDsreVjZp4l9yd1RjY3dHFfPzkcGz5MtskP2CMn5IxckmtSJ4K8kFfyRt5Ln8F0sBgsf5cGpVHPBhlDsPkFG7G2WQ=</latexit><latexit sha1_base64="6hVmX51F/0iLF5CM+4JFeLHkSRs=">ACXHicbVDLSgMxFE3Hd31VBTduokVQhDoRQZeiG3cqWBXaoWTS2xqaSYbkjliGrv0at/otbvwWM7WCrR64cDj3feJUSYdh+FEKpqZnZufmF8qLS8srq5W19TtnMiugLowy9iHmDpTUEeJCh5SCzyJFdzHvYsif/8E1kmjb7GfQpTwrpYdKTh6qVXZvtrTtKlMt5WzgyakTiqjB5Qd/vD9VqUa1sIh6F/CRqRKRrhurZWqzbYRWQIaheLONViYpRzi1IoGJSbmYOUix7vQsNTzRNwUT78ZUB3vdKmHWN9aKRD9XdHzhPn+knsKxOj24yV4j/5RoZdk6jXOo0Q9Die1EnUxQNLYyhbWlBoOp7woWV/lYqHrnlAr195bFRtyzKi+uKOWP7lYzBf6knpTIlRXhzFHcIzDsreVjZp4l9yd1RjY3dHFfPzkcGz5MtskP2CMn5IxckmtSJ4K8kFfyRt5Ln8F0sBgsf5cGpVHPBhlDsPkFG7G2WQ=</latexit><latexit sha1_base64="6hVmX51F/0iLF5CM+4JFeLHkSRs=">ACXHicbVDLSgMxFE3Hd31VBTduokVQhDoRQZeiG3cqWBXaoWTS2xqaSYbkjliGrv0at/otbvwWM7WCrR64cDj3feJUSYdh+FEKpqZnZufmF8qLS8srq5W19TtnMiugLowy9iHmDpTUEeJCh5SCzyJFdzHvYsif/8E1kmjb7GfQpTwrpYdKTh6qVXZvtrTtKlMt5WzgyakTiqjB5Qd/vD9VqUa1sIh6F/CRqRKRrhurZWqzbYRWQIaheLONViYpRzi1IoGJSbmYOUix7vQsNTzRNwUT78ZUB3vdKmHWN9aKRD9XdHzhPn+knsKxOj24yV4j/5RoZdk6jXOo0Q9Die1EnUxQNLYyhbWlBoOp7woWV/lYqHrnlAr195bFRtyzKi+uKOWP7lYzBf6knpTIlRXhzFHcIzDsreVjZp4l9yd1RjY3dHFfPzkcGz5MtskP2CMn5IxckmtSJ4K8kFfyRt5Ln8F0sBgsf5cGpVHPBhlDsPkFG7G2WQ=</latexit>

<latexit sha1_base64="tSF/2uVorul/Qm3kspCLi9j5+I=">ACQXicbVDLSsNAFJ34rPHV6tJNMAiuSiKCLotuXFboC9pQJtPbduhkEmZuxBL6E271b/wKP8GduHXjpM3Ctl64cDj3de4JE8E1et6HtbG5tb2zW9qz9w8Oj47LlZOWjlPFoMliEatOSDUILqGJHAV0EgU0CgW0w8l9Xm8/gdI8lg2cJhBEdCT5kDOKhur0INFcxLJfdr2qNw9nHfgFcEkR9X7FcnuDmKURSGSCat31vQSDjCrkTMDM7qUaEsomdARdAyWNQAfZXPDMuTDMwBnGyqREZ87+nchopPU0Ck1nRHGsV2s5+V+tm+LwNsi4TFIEyRaHhqlwMHby750BV8BQTA2gTHGj1WFjqihD45G9tKrhB1muLt+zdF/wEMyXcuVJjlRwFmS5KoRnFmG1v9VRPXQeuq6ntV/Hard0VBpfIGTknl8QnN6RGHkidNAkjgryQV/JmvVuf1pf1vWjdsIqZU7IU1s8vY6Sw1Q=</latexit><latexit sha1_base64="tSF/2uVorul/Qm3kspCLi9j5+I=">ACQXicbVDLSsNAFJ34rPHV6tJNMAiuSiKCLotuXFboC9pQJtPbduhkEmZuxBL6E271b/wKP8GduHXjpM3Ctl64cDj3de4JE8E1et6HtbG5tb2zW9qz9w8Oj47LlZOWjlPFoMliEatOSDUILqGJHAV0EgU0CgW0w8l9Xm8/gdI8lg2cJhBEdCT5kDOKhur0INFcxLJfdr2qNw9nHfgFcEkR9X7FcnuDmKURSGSCat31vQSDjCrkTMDM7qUaEsomdARdAyWNQAfZXPDMuTDMwBnGyqREZ87+nchopPU0Ck1nRHGsV2s5+V+tm+LwNsi4TFIEyRaHhqlwMHby750BV8BQTA2gTHGj1WFjqihD45G9tKrhB1muLt+zdF/wEMyXcuVJjlRwFmS5KoRnFmG1v9VRPXQeuq6ntV/Hard0VBpfIGTknl8QnN6RGHkidNAkjgryQV/JmvVuf1pf1vWjdsIqZU7IU1s8vY6Sw1Q=</latexit><latexit sha1_base64="tSF/2uVorul/Qm3kspCLi9j5+I=">ACQXicbVDLSsNAFJ34rPHV6tJNMAiuSiKCLotuXFboC9pQJtPbduhkEmZuxBL6E271b/wKP8GduHXjpM3Ctl64cDj3de4JE8E1et6HtbG5tb2zW9qz9w8Oj47LlZOWjlPFoMliEatOSDUILqGJHAV0EgU0CgW0w8l9Xm8/gdI8lg2cJhBEdCT5kDOKhur0INFcxLJfdr2qNw9nHfgFcEkR9X7FcnuDmKURSGSCat31vQSDjCrkTMDM7qUaEsomdARdAyWNQAfZXPDMuTDMwBnGyqREZ87+nchopPU0Ck1nRHGsV2s5+V+tm+LwNsi4TFIEyRaHhqlwMHby750BV8BQTA2gTHGj1WFjqihD45G9tKrhB1muLt+zdF/wEMyXcuVJjlRwFmS5KoRnFmG1v9VRPXQeuq6ntV/Hard0VBpfIGTknl8QnN6RGHkidNAkjgryQV/JmvVuf1pf1vWjdsIqZU7IU1s8vY6Sw1Q=</latexit><latexit sha1_base64="tSF/2uVorul/Qm3kspCLi9j5+I=">ACQXicbVDLSsNAFJ34rPHV6tJNMAiuSiKCLotuXFboC9pQJtPbduhkEmZuxBL6E271b/wKP8GduHXjpM3Ctl64cDj3de4JE8E1et6HtbG5tb2zW9qz9w8Oj47LlZOWjlPFoMliEatOSDUILqGJHAV0EgU0CgW0w8l9Xm8/gdI8lg2cJhBEdCT5kDOKhur0INFcxLJfdr2qNw9nHfgFcEkR9X7FcnuDmKURSGSCat31vQSDjCrkTMDM7qUaEsomdARdAyWNQAfZXPDMuTDMwBnGyqREZ87+nchopPU0Ck1nRHGsV2s5+V+tm+LwNsi4TFIEyRaHhqlwMHby750BV8BQTA2gTHGj1WFjqihD45G9tKrhB1muLt+zdF/wEMyXcuVJjlRwFmS5KoRnFmG1v9VRPXQeuq6ntV/Hard0VBpfIGTknl8QnN6RGHkidNAkjgryQV/JmvVuf1pf1vWjdsIqZU7IU1s8vY6Sw1Q=</latexit>

😎

Θ(n)

<latexit sha1_base64="1FIhJY7ia1iN3JUh1w3KRHRTuM=">ACQnicbVDLSsNAFJ3Ud31VXboJFqFuSiKCLkU3LhVaW2mD3Exv26GTSZi5EUvoV7jVv/En/AV34taFk5qFrV64cDj3de4JEykMed6bU1pYXFpeWV0r29sbm1XdnZvTZxqjk0ey1i3QzAohcImCZLYTjRCFEpshaPLvN56QG1ErBo0TjCIYKBEX3AgS91G0MkqKmj+0rVq3vTcP8CvwBVsT1/Y5T7fZinkaoiEswpuN7CQUZaBJc4qTcTQ0mwEcwI6FCiI0QTZVPHEPLdNz+7G2qcidsr8nMoiMGUeh7YyAhma+lpP/1Top9c+CTKgkJVT851A/lS7Fbv6+2xMaOcmxBcC1sFpdPgQNnKxJ5ZlVDT/IcnX5npn7UoRov1RzTwoCKXiQ5aLAED7SpGxt9edN/Atuj+u+V/dvTqrnF4XBq2yfHbAa89kpO2dX7Jo1GWcRe2LP7MV5d6dD+fzp7XkFDN7bCacr28MILCa</latexit><latexit sha1_base64="1FIhJY7ia1iN3JUh1w3KRHRTuM=">ACQnicbVDLSsNAFJ3Ud31VXboJFqFuSiKCLkU3LhVaW2mD3Exv26GTSZi5EUvoV7jVv/En/AV34taFk5qFrV64cDj3de4JEykMed6bU1pYXFpeWV0r29sbm1XdnZvTZxqjk0ey1i3QzAohcImCZLYTjRCFEpshaPLvN56QG1ErBo0TjCIYKBEX3AgS91G0MkqKmj+0rVq3vTcP8CvwBVsT1/Y5T7fZinkaoiEswpuN7CQUZaBJc4qTcTQ0mwEcwI6FCiI0QTZVPHEPLdNz+7G2qcidsr8nMoiMGUeh7YyAhma+lpP/1Top9c+CTKgkJVT851A/lS7Fbv6+2xMaOcmxBcC1sFpdPgQNnKxJ5ZlVDT/IcnX5npn7UoRov1RzTwoCKXiQ5aLAED7SpGxt9edN/Atuj+u+V/dvTqrnF4XBq2yfHbAa89kpO2dX7Jo1GWcRe2LP7MV5d6dD+fzp7XkFDN7bCacr28MILCa</latexit><latexit sha1_base64="1FIhJY7ia1iN3JUh1w3KRHRTuM=">ACQnicbVDLSsNAFJ3Ud31VXboJFqFuSiKCLkU3LhVaW2mD3Exv26GTSZi5EUvoV7jVv/En/AV34taFk5qFrV64cDj3de4JEykMed6bU1pYXFpeWV0r29sbm1XdnZvTZxqjk0ey1i3QzAohcImCZLYTjRCFEpshaPLvN56QG1ErBo0TjCIYKBEX3AgS91G0MkqKmj+0rVq3vTcP8CvwBVsT1/Y5T7fZinkaoiEswpuN7CQUZaBJc4qTcTQ0mwEcwI6FCiI0QTZVPHEPLdNz+7G2qcidsr8nMoiMGUeh7YyAhma+lpP/1Top9c+CTKgkJVT851A/lS7Fbv6+2xMaOcmxBcC1sFpdPgQNnKxJ5ZlVDT/IcnX5npn7UoRov1RzTwoCKXiQ5aLAED7SpGxt9edN/Atuj+u+V/dvTqrnF4XBq2yfHbAa89kpO2dX7Jo1GWcRe2LP7MV5d6dD+fzp7XkFDN7bCacr28MILCa</latexit><latexit sha1_base64="1FIhJY7ia1iN3JUh1w3KRHRTuM=">ACQnicbVDLSsNAFJ3Ud31VXboJFqFuSiKCLkU3LhVaW2mD3Exv26GTSZi5EUvoV7jVv/En/AV34taFk5qFrV64cDj3de4JEykMed6bU1pYXFpeWV0r29sbm1XdnZvTZxqjk0ey1i3QzAohcImCZLYTjRCFEpshaPLvN56QG1ErBo0TjCIYKBEX3AgS91G0MkqKmj+0rVq3vTcP8CvwBVsT1/Y5T7fZinkaoiEswpuN7CQUZaBJc4qTcTQ0mwEcwI6FCiI0QTZVPHEPLdNz+7G2qcidsr8nMoiMGUeh7YyAhma+lpP/1Top9c+CTKgkJVT851A/lS7Fbv6+2xMaOcmxBcC1sFpdPgQNnKxJ5ZlVDT/IcnX5npn7UoRov1RzTwoCKXiQ5aLAED7SpGxt9edN/Atuj+u+V/dvTqrnF4XBq2yfHbAa89kpO2dX7Jo1GWcRe2LP7MV5d6dD+fzp7XkFDN7bCacr28MILCa</latexit>

O(1)

<latexit sha1_base64="2LnxpVevFmMwF2hUrFlNxckMY=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KHsXvULJrbizcNaBtwAlsohar2iVuv2IJSFIZIJq3fHcGP2UKuRMwNTuJhpiysZ0CB0DJQ1B+lM7NQ5N0zfGUTKpERnxv6dSGmo9SQMTGdIcaRXaxn5X62T4ODGT7mMEwTJ5ocGiXAwcrLPnT5XwFBMDKBMcaPVYSOqKEPj720qu75aYu27N0X/AzJdy5UmOVHDmp5koqhGecWobW71VE9dB87LiuRXv8apUvV0YnCen5IyUiUeuSZXckxpEZG5IW8kjfr3fq0vqzveWvOWsyckKWwfn4BJD2uKA=</latexit><latexit sha1_base64="2LnxpVevFmMwF2hUrFlNxckMY=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KHsXvULJrbizcNaBtwAlsohar2iVuv2IJSFIZIJq3fHcGP2UKuRMwNTuJhpiysZ0CB0DJQ1B+lM7NQ5N0zfGUTKpERnxv6dSGmo9SQMTGdIcaRXaxn5X62T4ODGT7mMEwTJ5ocGiXAwcrLPnT5XwFBMDKBMcaPVYSOqKEPj720qu75aYu27N0X/AzJdy5UmOVHDmp5koqhGecWobW71VE9dB87LiuRXv8apUvV0YnCen5IyUiUeuSZXckxpEZG5IW8kjfr3fq0vqzveWvOWsyckKWwfn4BJD2uKA=</latexit><latexit sha1_base64="2LnxpVevFmMwF2hUrFlNxckMY=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KHsXvULJrbizcNaBtwAlsohar2iVuv2IJSFIZIJq3fHcGP2UKuRMwNTuJhpiysZ0CB0DJQ1B+lM7NQ5N0zfGUTKpERnxv6dSGmo9SQMTGdIcaRXaxn5X62T4ODGT7mMEwTJ5ocGiXAwcrLPnT5XwFBMDKBMcaPVYSOqKEPj720qu75aYu27N0X/AzJdy5UmOVHDmp5koqhGecWobW71VE9dB87LiuRXv8apUvV0YnCen5IyUiUeuSZXckxpEZG5IW8kjfr3fq0vqzveWvOWsyckKWwfn4BJD2uKA=</latexit><latexit sha1_base64="2LnxpVevFmMwF2hUrFlNxckMY=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KHsXvULJrbizcNaBtwAlsohar2iVuv2IJSFIZIJq3fHcGP2UKuRMwNTuJhpiysZ0CB0DJQ1B+lM7NQ5N0zfGUTKpERnxv6dSGmo9SQMTGdIcaRXaxn5X62T4ODGT7mMEwTJ5ocGiXAwcrLPnT5XwFBMDKBMcaPVYSOqKEPj720qu75aYu27N0X/AzJdy5UmOVHDmp5koqhGecWobW71VE9dB87LiuRXv8apUvV0YnCen5IyUiUeuSZXckxpEZG5IW8kjfr3fq0vqzveWvOWsyckKWwfn4BJD2uKA=</latexit>

Our solution

Optimal

😒

Θ(n2)

<latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit><latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit><latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit><latexit sha1_base64="FP+Prft5z6slG/yMkGkpyS+jFfE=">ACRHicbVDLSsNAFJ34tr5aXboJFkE3JSmCLotuXCq0tDGcjO9tUMnkzBzI5bQz3Crf+M/+A/uxK04qV3Y1gsXDue+zj1hIoUhz3t3lpZXVtfWNzYLW9s7u3vF0v6diVPNscFjGetWCAalUNgQRJbiUaIQonNcHiV15uPqI2IVZ1GCQYRPCjRFxzIUu1OfYAEJ+q+etotlr2KNwl3EfhTUGbTuOmWnHKnF/M0QkVcgjFt30soyECT4BLHhU5qMAE+hAdsW6gQhNkE81j9gyPbcfa5uK3An7dyKDyJhRFNrOCGhg5ms5+V+tnVL/IsiESlJCxX8P9VPpUuzmBrg9oZGTHFkAXAur1eUD0MDJ2lSYWVX3gyxXl+ZuS9FiPZLNfekIJCB1kuCgzhE40L1lZ/3sRFcFet+F7Fvz0r1y6nBm+wQ3bETpjPzlmNXbMb1mCcxeyZvbBX5835cD6dr9/WJWc6c8Bmwvn+AWXbsT4=</latexit>

O(n)

<latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit><latexit sha1_base64="TFdF1uIBdWAQRgHyL2Aq92BNRaA=">ACPXicbVDLSsNAFJ3UV42vVpdugkWom5KIoMuiG3dW6AvaUCbT23boZBJmbsQS+gtu9W/8Dj/Anbh16TtwrZeuHA493XuCWLBNbruh5Xb2Nza3snv2nv7B4dHheJxU0eJYtBgkYhUO6AaBJfQI4C2rECGgYCWsH4Lqu3nkBpHsk6TmLwQzqUfMAZxYx6KMuLXqHkVtxZOvAW4ASWUStV7RK3X7EkhAkMkG17nhujH5KFXImYGp3Ew0xZWM6hI6Bkoag/XQmduqcG6bvDCJlUqIzY/9OpDTUehIGpjOkONKrtYz8r9ZJcHDjp1zGCYJk80ODRDgYOdnTp8rYCgmBlCmuNHqsBFVlKHx15aVf8NFOX7Vm6L3gA5ku58iRHKjz0wU1QjPOLWNrd6qieugeVnx3Ir3eFWq3i4MzpNTckbKxCPXpEruSY0CMj8kJeyZv1bn1aX9b3vDVnLWZOyFJYP7+UeK5l</latexit>

time space Dynamic Programming (DP)

Optimal

guarantee

Stores a fixed amount to bits, say F, for each partition.

slide-31
SLIDE 31

10

Computing an optimal partition

Why is it so difficult?

slide-32
SLIDE 32

10

Computing an optimal partition

Why is it so difficult?

[8, 9, 10, 11, 12, 36, 37, 38, 39, 40]

slide-33
SLIDE 33

10

Computing an optimal partition

Why is it so difficult?

[8, 9, 10, 11, 12, 36, 37, 38, 39, 40]

splitting Elias-Fano VByte [0,10) 4 bpi [0,5)[5,10) [4][5] bpi [0,6)[6,10) [5][2] bpi

slide-34
SLIDE 34

10

Computing an optimal partition

Why is it so difficult?

[8, 9, 10, 11, 12, 36, 37, 38, 39, 40]

splitting Elias-Fano VByte [0,10) 4 bpi [0,5)[5,10) [4][5] bpi [0,6)[6,10) [5][2] bpi

Different costs to represent the same integers! —> DP

slide-35
SLIDE 35

10

Computing an optimal partition

Why is it so difficult?

[8, 9, 10, 11, 12, 36, 37, 38, 39, 40]

splitting Elias-Fano VByte [0,10) 4 bpi [0,5)[5,10) [4][5] bpi [0,6)[6,10) [5][2] bpi

Different costs to represent the same integers! —> DP

8 bpi [8][8] bpi [8][8] bpi

Costs do NOT change if we consider different splittings.

slide-36
SLIDE 36

11

Our solution - The intuition

VByte Bin

slide-37
SLIDE 37

11

Our solution - The intuition

VByte Bin

? ? ? ?? ? ? ?

slide-38
SLIDE 38

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

? ? ? ?? ? ? ?

slide-39
SLIDE 39

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

slide-40
SLIDE 40

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

slide-41
SLIDE 41

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-42
SLIDE 42

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-43
SLIDE 43

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-44
SLIDE 44

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-45
SLIDE 45

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-46
SLIDE 46

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-47
SLIDE 47

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-48
SLIDE 48

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-49
SLIDE 49

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-50
SLIDE 50

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-51
SLIDE 51

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-52
SLIDE 52

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-53
SLIDE 53

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-54
SLIDE 54

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-55
SLIDE 55

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

slide-56
SLIDE 56

11

Our solution - The intuition

If VByte is winning

  • ver Bin, we do NOT

have to try any split.

VByte Bin

?

gain = VByte - Bin

We pay F bits for each partition!

F bits

slide-57
SLIDE 57

12

Our solution - The algorithm

  • 1. Encode first partition.
  • 2. If |C - L| and g are > 2F, then encode

the current partition with C and set C = L, L = C.

  • 3. Repeat step (2) until the end of the sequence.
  • 4. Encode last partition.

gain = VByte - Bin g

C := current encoder L := last encoder

slide-58
SLIDE 58

12

Our solution - The algorithm

  • 1. Encode first partition.
  • 2. If |C - L| and g are > 2F, then encode

the current partition with C and set C = L, L = C.

  • 3. Repeat step (2) until the end of the sequence.
  • 4. Encode last partition.

gain = VByte - Bin g

All details (including proof of

  • ptimality), here:


https://arxiv.org/abs/1804.10949 C := current encoder L := last encoder

slide-59
SLIDE 59

12

Our solution - The algorithm

  • 1. Encode first partition.
  • 2. If |C - L| and g are > 2F, then encode

the current partition with C and set C = L, L = C.

  • 3. Repeat step (2) until the end of the sequence.
  • 4. Encode last partition.

gain = VByte - Bin g

Optimal.

All details (including proof of

  • ptimality), here:


https://arxiv.org/abs/1804.10949 C := current encoder L := last encoder

slide-60
SLIDE 60

12

Our solution - The algorithm

  • 1. Encode first partition.
  • 2. If |C - L| and g are > 2F, then encode

the current partition with C and set C = L, L = C.

  • 3. Repeat step (2) until the end of the sequence.
  • 4. Encode last partition.

gain = VByte - Bin g

Optimal.

All details (including proof of

  • ptimality), here:


https://arxiv.org/abs/1804.10949

Valid for ANY point-wise encoder.

C := current encoder L := last encoder

slide-61
SLIDE 61

12

Our solution - The algorithm

  • 1. Encode first partition.
  • 2. If |C - L| and g are > 2F, then encode

the current partition with C and set C = L, L = C.

  • 3. Repeat step (2) until the end of the sequence.
  • 4. Encode last partition.

gain = VByte - Bin g

Optimal.

All details (including proof of

  • ptimality), here:


https://arxiv.org/abs/1804.10949

Valid for ANY point-wise encoder. Very low constant factors.

C := current encoder L := last encoder

slide-62
SLIDE 62

12

Our solution - The algorithm

  • 1. Encode first partition.
  • 2. If |C - L| and g are > 2F, then encode

the current partition with C and set C = L, L = C.

  • 3. Repeat step (2) until the end of the sequence.
  • 4. Encode last partition.

gain = VByte - Bin g

Optimal.

All details (including proof of

  • ptimality), here:


https://arxiv.org/abs/1804.10949

Valid for ANY point-wise encoder. Very low constant factors. Linear time and constant space.

C := current encoder L := last encoder

slide-63
SLIDE 63

C++14 implementation compiled with gcc 7.2.0 with highest optimization setting.

13

Experimental Results on Gov2 and ClueWeb09

Code will be available upon acceptance of the paper.

slide-64
SLIDE 64

14

Partitioned VS. Unpartitioned: Space and Indexing Time

slide-65
SLIDE 65

14

Partitioned VS. Unpartitioned: Space and Indexing Time

2X 2X

slide-66
SLIDE 66

14

Partitioned VS. Unpartitioned: Space and Indexing Time

2X 2X

slide-67
SLIDE 67

14

Partitioned VS. Unpartitioned: Space and Indexing Time

2X 2X 2.5X

slide-68
SLIDE 68

15

Partitioned VS. Unpartitioned: AND queries and decoding

slide-69
SLIDE 69

15

Partitioned VS. Unpartitioned: AND queries and decoding

Speed NOT affected by partitioning.

slide-70
SLIDE 70

15

Partitioned VS. Unpartitioned: AND queries and decoding

Speed NOT affected by partitioning.

slide-71
SLIDE 71

15

Partitioned VS. Unpartitioned: AND queries and decoding

Speed NOT affected by partitioning.

slide-72
SLIDE 72

Overall Comparison

16

slide-73
SLIDE 73

Overall Comparison

16

slide-74
SLIDE 74

Overall Comparison

16

slide-75
SLIDE 75

17

Take-home messages

Just do not waste space with VByte:
 partition the sequences! Compression ratio is likely to improve a lot, without affecting speed. The partitioning algorithm is fast, optimal, and makes indexing even more efficient.

slide-76
SLIDE 76

Thanks for your attention, time, patience!

Any questions?

18

slide-77
SLIDE 77

Problem

Scale with the quantity of indexed data. (Some people would say: “Big Data”.)

Dataset Uncompressed Compressed Gov2 46GB 4GB (~11X) ClueWeb09 128GB 14GB (~9X)

19

slide-78
SLIDE 78

Problem

Scale with the quantity of indexed data. (Some people would say: “Big Data”.)

Dataset Uncompressed Compressed Gov2 46GB 4GB (~11X) ClueWeb09 128GB 14GB (~9X)

19

Can we put everything on disk ? Memory hierarchy!

slide-79
SLIDE 79

Problem

Scale with the quantity of indexed data. (Some people would say: “Big Data”.)

Dataset Uncompressed Compressed Gov2 46GB 4GB (~11X) ClueWeb09 128GB 14GB (~9X)

19

Can we put everything on disk ? Memory hierarchy!

https://blogs.dropbox.com/tech/2016/09/improving-the-performance-of-full-text-search/ See, for example:

slide-80
SLIDE 80

Problem

Scale with the quantity of indexed data. (Some people would say: “Big Data”.)

Dataset Uncompressed Compressed Gov2 46GB 4GB (~11X) ClueWeb09 128GB 14GB (~9X)

19

Can we put everything on disk ? Memory hierarchy!

https://blogs.dropbox.com/tech/2016/09/improving-the-performance-of-full-text-search/ See, for example: