如何插入到半排序列表中



我有一个很大的字符串半排序列表,只按第一个字符排序。每个字符串都附有一个ID。前x个条目以字母A开头,然后是以字母B开头的条目,依此类推。并非所有字母都必须表示。我所说的半排序是指存在异常(排序错误的条目(。不可能以正确的方式对条目进行排序。已经存在的条目必须保留在其ID上。

我精心制作了下面的例子,只包括起始字母A和B。以C、Z和S开头的条目输入错误。

示例:

| ID   | NAME |
|------|------|
| 6000 | AXXX |
| 6001 | AXZS |
| 6003 | AAFD |
| 6004 | CSDF |
| 6005 | ZSSF |
| 6006 | ASDF |
| 6007 | BXAS |
| 6010 | BZDS |
| 6011 | SHZF |
| 6012 | BHZT |

我想把条目添加到列表中。如果可能的话,名称以字母A开头的条目应与其他以字母A开始的条目分组插入,或者在最后插入。

在上面的例子中,一个名称以字母a开头的条目应该插入ID 6002。名称以字母B开头的条目应添加ID 6008。

我不知道如何解决这个问题。我的第一个想法是首先从最低ID开始迭代现有列表,并保存有关字母组的信息
类似:
Letter: A StartID: 6000 EndID: 6006 IsFull:False
Letter: B StartID: 6007 EndID: 6012 IsFull:False

然后,当涉及到使用上述信息来确定新条目的可能ID的插入时。插入新条目后,必须更新此信息。

然而,我不确定如何做到这一点。我所需要的只是一些可能的解决方案的伪代码,这样我就可以编写自己的代码。

您可能需要几个步骤

  • 如果插入组存在,则查找插入组的位置(如果前几个是BZ,在A之前呢?(
  • 查找组的最后一个成员(如果存在(,否则查找上一个组的最后成员(例如,插入F时(
  • 确定左索引中在组的最后一个成员之后和下一个组的第一个成员之前是否有空间
  • 如果存在要插入的位置,请插入值,否则
    • 找到最后一个位置
    • 附加值

的一些注意事项

  • 你必须跟踪并考虑几个位置,一些结构会帮助你做到这一点
  • 如果您在左列中按顺序运行ABZC,则带有Z的块是否包含一个组?C块放错地方了吗?否则,无论第一个新成员在哪里,你的价值观都应该增长
  • "下一个";需要考虑多个字符(推测ABAAAABB之后(

最新更新