Exemple #1
0
        public void EncodeInRange(long value, int first, int last, double sum)
        {
            if (first >= last)
            {
                return;
            }

            double sumHalf    = sum / 2;
            double currentSum = 0;

            for (int i = first; i <= last; i++)
            {
                ShannonItem item = values[i];
                currentSum += item.probability;
                if (item.value == value)
                {
                    int halfIndex = GetHalfIndex(sumHalf, first, last);
                    if (i >= halfIndex)
                    {
                        inputOutput.WriteBit(true);
                        EncodeInRange(value, halfIndex, last, sumHalf);
                        return;
                    }
                    else
                    {
                        inputOutput.WriteBit(false);
                        EncodeInRange(value, first, halfIndex - 1, sumHalf);
                        return;
                    }
                }
            }
        }
Exemple #2
0
        public int GetHalfIndex(double sumHalf, int first, int last)
        {
            long currentSum = 0;

            for (int i = first; i <= last; i++)
            {
                ShannonItem item = values[i];
                currentSum += item.probability;
                if (currentSum > sumHalf)
                {
                    if (i == first)
                    {
                        return(i + 1);
                    }
                    return(i);
                }
            }
            throw new Exception("Half index not found");
        }