Android compose状态缓存算法

发布于:2022-12-13 ⋅ 阅读:(862) ⋅ 点赞:(0)

Gap Buffer 是一种数据结构,用于以有效的方式编辑和存储当前正在编辑的文本。它也类似于数组,但在数组中引入了一个间隙,用于处理光标处的多个更改。让我们假设一个间隙是另一个包含空格的数组。

示例:考虑一个初始间隙大小为 10 的示例,最初,数组或间隙大小相同,因为我们将元素插入数组中,类似地元素将被插入间隙缓冲区,唯一的区别是每次插入时间隙大小都会减小。
在这里插入图片描述
在这里插入图片描述 前面插入字符的基本情况。现在,每当需要在某个位置插入字符时,我们只需使用 left() 和 right()将间隙向上移动到该位置,然后尝试插入字符。

需要间隙缓冲器

  • 数组是一种将项目存储在连续内存位置的数据结构。但是,在数组末尾需要 O(1) 插入,而前面需要 O(n) 时间,因为数组将向右移动 n
    个位置,n 是数组的长度。
  • 当涉及到文本编辑器时,我们需要一个更快的数据结构来进行插入和修改,因为光标位置有多个更改。
  • 在最坏的情况下,数组将花费 O(n) 时间来插入或修改,如下例所示。
  • 为了在前面插入“GEEKS”,通过移动数组来为插入每个字符留出空间。

在这里插入图片描述

Gap Buffer中的基本操作

  • insert():这是一个用于在给定位置将字符插入文本的过程。它首先检查间隙是否为空,如果发现间隙为空,则调用过程grow()并调整间隙的大小,现在可以插入元素。
  • left() :这是一个用于将光标向左移动的过程,该光标点用作更改的位置。
    在这里插入图片描述
  • right:这是一个用于将光标向右移动的程序,该光标点用作更改的位置。
    在这里插入图片描述
  • 增长:这是在间隙大小变为零时使用的过程,因此我们需要通过在所需位置插入间隙来调整数组的大小。
    在这里插入图片描述

间隙缓冲器与绳索

现在,虽然它的插入需要 O(1) 时间,但还有另一个函数**grow()**大约需要 O(n) 时间。因此可能会认为这可能与绳索数据结构花费相同的时间,但增长的成本正在通过其他更便宜的过程(例如 left()、right() 和 insert())的摊销成本来补偿。因此,这种数据结构在文本编辑器中优于其他数据结构,例如绳索,因为它易于实现。

实现间隙缓冲区

// Java program of implementation of gap buffer
import java.util.*;
class GFG
{
static char []buffer = new char[50];
static int gap_size = 10;
static int gap_left = 0;
static int gap_right = gap_size - gap_left - 1;
static int size = 10;

// Function that is used to grow the gap
// at index position and return the array
static void grow(int k, int position)
{
	char []a = new char[size];

	// Copy characters of buffer to a[]
	// after position
	for (int i = position; i < size; i++)
	{
		a[i - position] = buffer[i];
	}
	
	// Insert a gap of k from index position
	// gap is being represented by '-'
	for (int i = 0; i < k; i++)
	{
		buffer[i + position] = '_';
	}
	
	// Reinsert the remaining array
	for (int i = 0; i < k; i++)
	{
		buffer[position + k + i] = a[i];
	}

	size += k;
	gap_right += k;
}

// Function that is used to move the gap
// left in the array
static void left(int position)
{
	// Move the gap left character by character
	// and the buffers
	while (position < gap_left)
	{
		gap_left--;
		gap_right--;
		buffer[gap_right + 1] = buffer[gap_left];
		buffer[gap_left]='_';
	}
}

// Function that is used to move the gap
// right in the array
static void right(int position)
{
	
	// Move the gap right character by character
	// and the buffers
	while (position > gap_left)
	{
		gap_left++;
		gap_right++;
		buffer[gap_left - 1] = buffer[gap_right];
		buffer[gap_right]='_';
	}
}

// Function to control the movement of gap
// by checking its position to the point of
// insertion
static void move_cursor(int position)
{
	if (position < gap_left)
	{
		left(position);
	}
	else
	{
		right(position);
	}
}

// Function to insert the string to the buffer
// at point position
static void insert(String input, int position)
{
	int len = input.length();
	int i = 0;

	// If the point is not the gap check
	// and move the cursor to that point
	if (position != gap_left)
	{
		move_cursor(position);
	}

	// Insert characters one by one
	while (i < len)
	{
		// If the gap is empty grow the size
		if (gap_right == gap_left)
		{
			int k = 10;
			grow(k, position);
		}

		// Insert the character in the gap and
		// move the gap
		buffer[gap_left] = input.charAt(i);
		gap_left++;
		i++;
		position++;
	}
}

// Driver code
public static void main(String[] args)
{
	// Initializing the gap buffer with size 10
	for (int i = 0; i < 10; i++)
	{
		buffer[i] = '_';
	}

	System.out.println("Initializing the gap" +
					" buffer with size 10");

	for (int i = 0; i < size; i++)
	{
		System.out.print(buffer[i] + " ");
	}

	System.out.println();

	// Inserting a string to buffer
	String input = "GEEKSGEEKS";
	int position = 0;

	insert(input, position);

	System.out.println();
	System.out.println("Inserting a string " +
					"to buffer: GEEKSGEEKS");
	System.out.print("Output: ");
	for (int i = 0; i < size; i++)
	{
		System.out.print(buffer[i] + " ");
	}

	input = "FOR";
	position = 5;

	insert(input, position);

	System.out.println();
	System.out.println();
	
	System.out.println("Inserting a string" +
					" to buffer: FOR");
	System.out.print("Output: ");
	for (int i = 0; i < size; i++)
	{
		System.out.print(buffer[i] + " ");
	}
	}
}

// This code is contributed by Princi Singh

输出

初始化大小为 10 的间隙缓冲区
_ _ _ _ _ _ _ _ _ _ 


将字符串插入缓冲区:GEEKSGEEKS
输出:GEEKSGEEKS _ _ _ _ _ _ _ _ _ _

将字符串插入缓冲区:FOR
输出:GEEKSFOR _ _ _ _ _ _ _ GEEKS

插入的时间复杂度:O(1) 增长的时间复杂度:O(n)

https://www.geeksforgeeks.org/gap-buffer-data-structure/

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到