Если вы хотите ускорить случай UTF8 ...
Сначала рассмотрите возможность последовательной индексации кодовых точек, чтобы избежать повторного подсчета их с самого начала строки.Реализуйте и используйте подпрограммы для индексации следующей и предыдущей кодовых точек.
Во-вторых, вы можете встроить массив индексов в кодовые точки строки UTF8 и использовать его в качестве первого шага при поиске, это даст вамприблизительное местоположение искомой кодовой точки.
Вы можете иметь его (массив) фиксированного размера, и в этом случае вы все равно получите время поиска ~ O (n) с O (1) стоимостью памяти, или оно будет иметьсодержат одинаково расположенные индексы (то есть индексы в каждой m-й кодовой точке, где m некоторая константа), и в этом случае вы получите время поиска ~ O (m + log (n)) со стоимостью памяти O (n).
Вы также можете встраивать индексы в данные кодовой точки, кодирующие их как зарезервированные / неиспользуемые / и т. Д. Кодовые точки, или использовать недопустимое кодирование (скажем, сначала байт является 11111110 двоичным, а затем, например, 6 10xxxxxx байтов, содержащихуказатель или что угодно).