数据结构与算法之 B 树 电商平台 商品索引 / 价格范围 设计

数据结构与算法阿木 发布于 2025-07-12 13 次阅读


B树在电商平台商品索引与价格范围中的应用

在电商平台上,商品索引和价格范围查询是用户最常用的功能之一。随着电商平台的不断发展,商品种类和数量的激增,如何高效地管理和查询这些数据成为了一个关键问题。B树作为一种平衡的多路查找树,因其高效的插入、删除和查询性能,在数据库索引和文件系统中得到了广泛应用。本文将探讨如何利用B树来设计电商平台商品索引和价格范围查询系统。

B树概述

B树是一种自平衡的树结构,它能够将数据元素组织成一种层次结构,使得数据的插入、删除和查询操作都能在O(log n)的时间复杂度内完成。B树的特点如下:

1. 每个节点最多有m个子节点,其中m是一个大于等于2的常数。

2. 除了根节点和叶子节点外,每个节点至少有m/2个子节点。

3. 所有叶子节点都在同一层,且不包含任何关键字。

4. 每个节点中的关键字数量等于其子节点数量减一。

商品索引设计

在电商平台中,商品索引的设计需要考虑以下因素:

1. 商品信息:包括商品ID、名称、价格、分类等。

2. 索引结构:选择合适的索引结构来存储商品信息。

3. 查询优化:设计高效的查询算法来满足用户需求。

以下是一个基于B树的商品索引设计示例:

python

class BTreeNode:


def __init__(self, leaf=False, t=2):


self.leaf = leaf


self.keys = [None] (t - 1)


self.children = [None] t

class BTree:


def __init__(self, t=2):


self.root = BTreeNode(leaf=True, t=t)

def insert(self, key):


root = self.root


if len(root.keys) == (2 root.t) - 1:


new_root = BTreeNode(t=root.t)


new_root.children[0] = root


self.root = new_root


self.split_child(new_root, 0)


self.insert_non_full(new_root, key)


else:


self.insert_non_full(root, key)

def split_child(self, parent, i):


t = parent.t


child = parent.children[i]


new_child = BTreeNode(t=t, leaf=child.leaf)


mid = t - 1


for j in range(t - 1, 0, -1):


new_child.keys[j - 1] = child.keys[j]


new_child.children[0] = child.children[0]


if not child.leaf:


for j in range(1, t):


new_child.children[j] = child.children[j]


for j in range(t - 1, i, -1):


parent.children[j] = None


parent.keys[i - 1] = child.keys[mid]


parent.children[i] = new_child

def insert_non_full(self, node, key):


i = len(node.keys) - 1


if node.leaf:


node.keys.append(None)


while i >= 0 and key < node.keys[i]:


node.keys[i + 1] = node.keys[i]


i -= 1


node.keys[i + 1] = key


else:


while i >= 0 and key < node.keys[i]:


i -= 1


i += 1


if len(node.children[i].keys) == (2 node.t) - 1:


self.split_child(node, i)


i += 1


self.insert_non_full(node.children[i], key)

def search(self, key):


return self._search(self.root, key)

def _search(self, node, key):


i = len(node.keys) - 1


if node.leaf:


while i >= 0 and key < node.keys[i]:


i -= 1


if i >= 0:


return node.keys[i]


else:


return None


else:


while i >= 0 and key < node.keys[i]:


i -= 1


i += 1


return self._search(node.children[i], key)

示例:创建B树并插入商品信息


b_tree = BTree()


b_tree.insert('商品1')


b_tree.insert('商品2')


b_tree.insert('商品3')


b_tree.insert('商品4')


b_tree.insert('商品5')


b_tree.insert('商品6')


b_tree.insert('商品7')


b_tree.insert('商品8')


b_tree.insert('商品9')


b_tree.insert('商品10')

查询商品信息


print(b_tree.search('商品5'))


价格范围查询设计

在电商平台中,用户经常需要根据价格范围来查询商品。以下是一个基于B树的价格范围查询设计示例:

python

def range_query(node, low, high):


result = []


if node is None:


return result


if node.leaf:


for i in range(len(node.keys)):


if low <= node.keys[i] <= high:


result.append(node.keys[i])


else:


for i in range(len(node.keys)):


if low < node.keys[i]:


result.extend(range_query(node.children[i], low, high))


if low <= node.keys[i] <= high:


result.append(node.keys[i])


if high < node.keys[i]:


result.extend(range_query(node.children[i + 1], low, high))


return result

示例:查询价格范围在100到200的商品


price_range = range_query(b_tree.root, 100, 200)


print(price_range)


总结

本文介绍了如何利用B树来设计电商平台商品索引和价格范围查询系统。通过B树的高效插入、删除和查询性能,可以有效地管理和查询电商平台中的大量商品数据。在实际应用中,可以根据具体需求调整B树的参数,以优化性能。