Java 如何快速找到特定范围内的字符串数?

Java 如何快速找到特定范围内的字符串数?,java,string,performance,tree,comparison,Java,String,Performance,Tree,Comparison,有人问我一个问题: 给定一个字符串列表和一个查询列表:START和END,两者都是字符串。我必须找到[START,END]范围内的字符串数 例如: 字符串列表:a、AA、AB、CD、ZS、XYZ 查询列表: A, AA A, CC AB, ZZ AC, CD 输出应为: 1 3 3 0 我解决这个问题的方法是:在遍历字符串列表时,通过逐个插入新字符串来创建AVL树。(起初,我使用了不平衡的BST,但有时间限制。)在进行比较时,我使用java字符串中的compareTo函数 创建AVL树后,我

有人问我一个问题:

给定一个字符串列表和一个查询列表:START和END,两者都是字符串。我必须找到[START,END]范围内的字符串数

例如: 字符串列表:
a、AA、AB、CD、ZS、XYZ
查询列表:

A, AA
A, CC
AB, ZZ
AC, CD
输出应为:

1
3
3
0
我解决这个问题的方法是:在遍历字符串列表时,通过逐个插入新字符串来创建AVL树。(起初,我使用了不平衡的BST,但有时间限制。)在进行比较时,我使用java字符串中的compareTo函数

创建AVL树后,我运行从[start,end]开始计数的查询。 我的方法是

1. let v = root.

2. if v==null -> return 0 

   else if v.value < start -> count(v.right)

   else if v.value >= end -> count(v.left)

   else 1 + count(v.right) + count(v.left)
1。设v=root。
2.如果v==null->返回0
否则,如果v.valuecount(v.right)
否则,如果v.value>=结束->计数(v.left)
其他1+计数(右)+计数(左)
但是,我仍然有时间限制:(

因此,我改变了方法,通过将散列函数散列为double来创建散列函数,并使用compareTo,而不是比较散列值

但是,我还有时间限制

因此,我将子树大小的值存储到每个顶点中,而不是使用count或time,我添加了更多的条件语句,其中一些可以使用子树的大小,而不是递归调用count函数


有什么建议让它在特定时间运行吗?:\

使用订单统计树:

它基本上是一个修改的平衡bst,其中每个节点存储其子树的大小,这允许您回答关于日志(n)时间中给定项之前有多少项的查询