internal void Optimize(OptimizationContext context)
        {
            if (Optimized)
            {
                return;
            }

            if (FullLength == 0)
            {
                var end = Starts[Starts.Count - 1] + Lengths[Lengths.Count - 1];
                FullLength = end - Starts.MinValue + 1;
            }

            OptimizeStarts(context);
            Starts.Optimize(context);
            Lengths.Optimize(context);
            SharedIndices.Optimize(context);

            OptimizeLists(context);

            Optimized = true;
        }