【左程云算法全讲5】前缀树、非比较排序

系列综述:
目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
结语:如果有帮到你的地方,就点个赞关注一下呗,谢谢!!!
【C++】秋招&实习面经汇总篇


文章目录

      • 前缀树
      • 前缀树
    • 参考博客


点此到文末惊喜↩︎

前缀树

  1. 每个结点
    • int pass:表示当前结点通过的次数
    • int end:表示该节点作为字符串结尾次数
  2. 作用
    • 空间换时间,通过字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
    • 高效地存储和检索字符串数据集中的键
    • 可用于自动补完和拼写检查。
  3. 效率上
    • 哈希表时间效率高,但是前缀树可以进行动态查询,即查询一个单词可以只查询一部分即可返回结果
    • 支持查询以x字符作为前缀的数量
  4. 前缀树的基本结构
struct Node{
	int pass;	// 该结点的通过数
	int end;	// 以该结点为结尾的结尾数
	vector<int> *nexts;	// 如果字符过多可使用unordered_map nexts 
	Node(){
		pass = 0;
		end = 0;
		next = new vector<Node>(26);
	}
};

class Trie{
public:
	Trie(){
		root = new Node();
	}

	void insert(string str) {
		// 健壮性检查
		if (str.empty()) return ;
		// 初始化
		Node *node = root;	// 获得根节点的引用
		node->pass++;		// 根节点被经过了,pass++
		int path = 0;		// 表示要走的路径
		// 算法部分
		for (int i = 0; i < str.size(); ++i) {	// 遍历字符串
			path = str[i] - 'a';		// 求出nexts中的下一个路径
			// 无结点建立,有结点复用
			if (node->nexts[path] == nullptr) {
				node->nexts[path] = new Node();
			}
			node = node->nexts[path];	// 访问下一个
			node->pass++;				// 访问数+1
		}
		node->end++;					// 结尾结点结尾数end++
	}

	int Search(string str) {
		if (str.size() == 0) return 0;
		Node *node = root;
		int path = 0;
		for (int i = 0; i < str.size(); ++i) {
			// doing
			path = str[i] - 'a';
			if (node->nexts[path] == nullptr) 
				return 0;
			// 迭代
			node = node->next[path];
		}
		return node->end;
	}

	int TrieNumber(string prev) {
		if (prev.empty()) return 0;
		Node *node = root;
		int path = 0; 
		for (int i = 0; i < prev.size(); ++i) {
			path = prev[i] - 'a';
			if (node->nexts[path] == nullptr) 
				return 0;
			node = node->nexts[path];
		}
		return node->pass;
	}
	// java会自动释放,但是cpp有内存泄漏问题,需要使用shared_ptr进行处理
	void DeleteTrie(string str) {
		if (search(word) != 0) {	// 有该字符串才能删除
			Node *node = root;
			int path = 0;
			for (int i = 0; i < str.size(); ++i) {
				if (--node->nexts[path].pass == 0) {
					node.nexts[path] = nullptr;
					// release
					return ;
				}
				node = node->nexts[path];
			}
			node->end--;
		}
	}

private:
	Node root;

};

前缀树

  1. 【排序相关】


少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
不如点赞·收藏·关注一波

点此跳转到首行↩︎

参考博客

  1. 对数器
  2. 单调队列
  3. 快速链表quicklist
  4. 《深入理解计算机系统》
  5. 侯捷C++全系列视频
  6. 待定引用
  7. 待定引用
  8. 待定引用

你可能感兴趣的:(左程云算法,算法,开发语言)