我有一个字符串数组,大约有50,000个元素。
export const companies = [
"000014",
"000016",
"000017",
"000019",
"000020",
"000021",
"000023",
"000025",
...
]
这些是公司的名字,我为它们显示某些页面。我做了一个中间件,在其中运行一个循环,遍历这个大数组。
import { NextResponse, type NextRequest } from "next/server";
import { companies } from "./assets/companies";
export async function middleware(req: NextRequest) {
const { pathname } = req.nextUrl;
// cycle for comparing current URL with companies
await for (let i = 0; i < companies.length; i++) {
if (pathname.startsWith(`/${companies[i]}`))
return NextResponse.redirect(new URL("/", req.url)); // redirect to main page if companies compare with current pathname
}
}
这需要一些时间,如何优化它呢?曾经有一个想法是将数组划分为块,但这也不是一个很好的选择。
3条答案
按热度按时间kiayqfof1#
假设pathname看起来像
/000014/abc/xyz
,那么你可以完全摆脱数组迭代。话虽如此,50,000个元素并不是真的那么大,考虑到所有的事情,代码不应该特别慢,不必要的
await
和循环内部的字符串构建可能是一个问题。n9vozmp42#
如果由于某种原因,你不能像@Aurast建议的那样只进行Map/对象查找(例如,你需要进行自由文本搜索来找到最匹配的名称),那么一个非常简单的方法是将公司分组,这样你就可以将列表分成更小的块,并且只搜索一个块。
然后你可以只查第一个字母,以得到一个更小的数组,这将是非常简单的实现。
另一种方法是得出逻辑结论,然后递归地按首字母分组到一个名为
trie
或prefix tree
的数据结构中,这样即使不是完全匹配,也可以非常快速地搜索内容。bt1cpqcv3#
有几种方法可以提高性能
以下是使用
Binary Search
的示例二进制搜索算法
数组应排序以使用
Binary Search
哈希表
缓存
或者,您可以使用
Redis
数据库进行缓存。时间复杂度
Linear search: O(n),
**其中n是数组的大小。这意味着搜索时间随数组的大小线性增加。线性搜索是最基本的搜索算法,相对容易实现,但对于大型数组来说可能会很慢。Binary search: O(log n),
**其中n是数组的大小。这意味着搜索时间随数组大小的增加而呈对数增加。二进制搜索比线性搜索更有效,但它要求对数组进行排序。Hash table: O(1),
**其中n是数组的大小。这意味着搜索时间是恒定的,与数组的大小无关。哈希表对于搜索和插入操作非常有效,但它们会占用大量内存。Cache: O(1),
**其中n是高速缓存的大小。这意味着搜索时间是恒定的,不依赖于数组的大小。高速缓存可用于存储开销较大的搜索结果,并避免每次搜索整个数组的需要。高速缓存的大小通常比数组的大小小得多,因此搜索时间通常非常快。但是,高速缓冲存储器可随时间而填满,且可能需要周期性地清除以释放存储器。