【轻松掌握数据结构与算法】搜索算法

什么是数据结构和算法 从远古的汇编语言到现代编程语言,计算机编程已经变得更加强大、高效和先进。然而,计算机编程中的数据结构和算法的核心概念和使用并没有改变。从一开始,DSA就一直是计算机编程的核心。 备注: 下文统一使用DSA表示数据结构和算法。 你可能听说过DSA主要在计算机科学领域使用。然而,DSA的使用并不限于计算机领域。我们可以发现DSA的概念在日常生活中也被使用。在本文,我们将讨论日常生活中使用的DSA常见场景。但在此之前,让我们先了解一下数据结构和算法的基本知识。 什么是数据结构和算法(DSA)? 数据结构和算法 阅读详情

Searching(搜索)

在计算机科学中,搜索算法是用于在数据结构中查找特定元素的算法。本章将详细介绍几种常见的搜索算法,包括线性搜索、二分搜索、插值搜索等,并探讨它们的适用场景和性能特点。

什么是搜索?

搜索算法的目标是在给定的数据结构中找到一个特定的元素。搜索可以分为两类:无序搜索和有序搜索。无序搜索适用于未排序的数据,而有序搜索则适用于已排序的数据。

为什么需要搜索?

搜索算法在许多应用场景中都非常有用,例如在数据库中查找记录、在文件系统中查找文件、在网页中查找特定内容等。高效的搜索算法可以显著提高系统的性能和用户体验。

搜索的类型

无序线性搜索

无序线性搜索是最基本的搜索算法,适用于未排序的数据。它通过遍历数据结构中的每个元素来查找目标元素。

示例代码
def linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i  # 返回目标元素的索引
    return -1  # 如果未找到,返回 -1

# 示例输入
arr = [4, 2, 7, 1, 9, 3]
target = 7

# 示例输出
index = linear_search(arr, target)
print(f"Element {target} found at index {index}")  # 输出: Element 7 found at index 2

有序线性搜索

有序线性搜索适用于已排序的数据。虽然它仍然需要遍历每个元素,但由于数据已排序,可以在找到目标元素或一个比目标元素大的元素时提前终止搜索。

示例代码
def ordered_linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i  # 返回目标元素的索引
        elif arr[i] > target:
            return -1  # 如果当前元素大于目标元素,提前终止搜索
    return -1  # 如果未找到,返回 -1

# 示例输入
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
target = 5

# 示例输出
index = ordered_linear_search(arr, target)
print(f"Element {target} found at index {index}")  # 输出: Element 5 found at index 4

二分搜索

二分搜索是一种高效的搜索算法,适用于已排序的数据。它通过不断将搜索区间一分为二来查找目标元素,时间复杂度为 O(log⁡n)

示例代码
def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid  # 返回目标元素的索引
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1  # 如果未找到,返回 -1

# 示例输入
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
target = 5

# 示例输出
index = binary_search(arr, target)
print(f"Element {target} found at index {index}")  # 输出: Element 5 found at index 4

插值搜索

插值搜索是一种改进的二分搜索,适用于数据分布较为均匀的情况。它通过估计目标元素可能的位置来缩小搜索区间,时间复杂度在最佳情况下可以达到 O(log⁡log⁡n)

示例代码
def interpolation_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right and target >= arr[left] and target <= arr[right]:
        if left == right:
            if arr[left] == target:
                return left
            return -1
        pos = left + ((target - arr[left]) * (right - left)) // (arr[right] - arr[left])
        if arr[pos] == target:
            return pos
        elif arr[pos] < target:
            left = pos + 1
        else:
            right = pos - 1
    return -1  # 如果未找到,返回 -1

# 示例输入
arr = [10, 20, 30, 40, 50, 60, 70, 80, 90]
target = 50

# 示例输出
index = interpolation_search(arr, target)
print(f"Element {target} found at index {index}")  # 输出: Element 50 found at index 4

比较基本的搜索算法

时间复杂度

  • 无序线性搜索:O(n)
  • 有序线性搜索:O(n)
  • 二分搜索:O(log⁡n)
  • 插值搜索:O(log⁡log⁡n)(最佳情况)

适用场景

  • 无序线性搜索:适用于未排序的数据。

  • 有序线性搜索:适用于已排序的数据,但数据量较小。

  • 二分搜索:适用于已排序的数据,尤其是数据量较大时。

  • 插值搜索:适用于已排序且数据分布较为均匀的情况。

符号表和哈希

符号表(Symbol Table)是一种数据结构,用于存储键值对。哈希表(Hash Table)是一种实现符号表的高效方法,通过哈希函数将键映射到表中的位置,从而实现快速的插入和查找操作。

哈希表的基本操作

  • 插入:将键值对插入哈希表。

  • 查找:根据键查找值。

  • 删除:根据键删除键值对。

示例代码
class HashTable:
    def __init__(self, size=10):
        self.size = size
        self.table = [[] for _ in range(size)]

    def _hash(self, key):
        return hash(key) % self.size

    def insert(self, key, value):
        index = self._hash(key)
        for item in self.table[index]:
            if item[0] == key:
                item[1] = value
                return
        self.table[index].append([key, value])

    def search(self, key):
        index = self._hash(key)
        for item in self.table[index]:
            if item[0] == key:
                return item[1]
        return None

    def delete(self, key):
        index = self._hash(key)
        for i, item in enumerate(self.table[index]):
            if item[0] == key:
                del self.table[index][i]
                return

# 示例输入
hash_table = HashTable()
hash_table.insert("apple", 5)
hash_table.insert("banana", 7)
hash_table.insert("cherry", 3)

# 示例输出
print(hash_table.search("banana"))  # 输出: 7
hash_table.delete("banana")
print(hash_table.search("banana"))  # 输出: None

哈希函数

哈希函数用于将键映射到哈希表中的位置。一个好的哈希函数应该能够均匀地分布键,以减少冲突。

示例代码
def simple_hash(key, table_size):
    return sum(ord(c) for c in key) % table_size

# 示例输入
key = "apple"
table_size = 10

# 示例输出
print(simple_hash(key, table_size))  # 输出: 5

冲突解决技术

  • 链地址法(Separate Chaining):每个哈希表位置存储一个链表,用于处理冲突。

  • 开放定址法(Open Addressing):在哈希表中寻找下一个空闲位置来存储冲突的键值对。

示例代码(链地址法)
class HashTable:
    def __init__(self, size=10):
        self.size = size
        self.table = [[] for _ in range(size)]

    def _hash(self, key):
        return hash(key) % self.size

    def insert(self, key, value):
        index = self._hash(key)
        for item in self.table[index]:
            if item[0] == key:
                item[1] = value
                return
        self.table[index].append([key, value])

    def search(self, key):
        index = self._hash(key)
        for item in self.table[index]:
            if item[0] == key:
                return item[1]
        return None

    def delete(self, key):
        index = self._hash(key)
        for i, item in enumerate(self.table[index]):
            if item[0] == key:
                del self.table[index][i]
                return

# 示例输入
hash_table = HashTable()
hash_table.insert("apple", 5)
hash_table.insert("banana", 7)
hash_table.insert("cherry", 3)

# 示例输出
print(hash_table.search("banana"))  # 输出: 7
hash_table.delete("banana")
print(hash_table.search("banana"))  # 输出: None
示例代码(开放定址法)
class HashTable:
    def __init__(self, size=10):
        self.size = size
        self.table = [None] * size

    def _hash(self, key):
        return hash(key) % self.size

    def _rehash(self, old_hash):
        return (old_hash + 1) % self.size

    def insert(self, key, value):
        index = self._hash(key)
        while self.table[index] is not None and self.table[index][0] != key:
            index = self._rehash(index)
        self.table[index] = (key, value)

    def search(self, key):
        index = self._hash(key)
        start_index = index
        while self.table[index] is not None:
            if self.table[index][0] == key:
                return self.table[index][1]
            index = self._rehash(index)
            if index == start_index:
                break
        return None

    def delete(self, key):
        index = self._hash(key)
        start_index = index
        while self.table[index] is not None:
            if self.table[index][0] == key:
                self.table[index] = None
                return
            index = self._rehash(index)
            if index == start_index:
                break

# 示例输入
hash_table = HashTable()
hash_table.insert("apple", 5)
hash_table.insert("banana", 7)
hash_table.insert("cherry", 3)

# 示例输出
print(hash_table.search("banana"))  # 输出: 7
hash_table.delete("banana")
print(hash_table.search("banana"))  # 输出: None

哈希表的性能

哈希表的性能取决于哈希函数的质量和冲突解决策略。在理想情况下,哈希表的插入、查找和删除操作的时间复杂度可以达到 O(1)

字符串搜索算法

字符串搜索算法用于在文本中查找特定的模式。常见的字符串搜索算法包括暴力搜索、Rabin-Karp 算法、有限自动机搜索、KMP 算法和 Boyer-Moore 算法。

暴力搜索

暴力搜索是最基本的字符串搜索算法,通过逐个比较文本和模式中的字符来查找模式。

示例代码
def brute_force_search(text, pattern):
    n = len(text)
    m = len(pattern)
    for i in range(n - m + 1):
        j = 0
        while j < m and text[i + j] == pattern[j]:
            j += 1
        if j == m:
            return i  # 返回模式的起始索引
    return -1  # 如果未找到,返回 -1

# 示例输入
text = "abcabcabc"
pattern = "abc"

# 示例输出
index = brute_force_search(text, pattern)
print(f"Pattern found at index {index}")  # 输出: Pattern found at index 0

Rabin-Karp 算法

Rabin-Karp 算法通过使用哈希函数来加速模式匹配过程。它在文本中滑动窗口,计算每个窗口的哈希值,并与模式的哈希值进行比较。

示例代码
def rabin_karp_search(text, pattern, prime, d):
    n = len(text)
    m = len(pattern)
    p = 0  # 模式的哈希值
    t = 0  # 文本的哈希值
    h = 1  # h = d^(m-1) % prime
    for i in range(m - 1):
        h = (h * d) % prime
    for i in range(m):
        p = (d * p + ord(pattern[i])) % prime
        t = (d * t + ord(text[i])) % prime
    for i in range(n - m + 1):
        if p == t:
            for j in range(m):
                if text[i + j] != pattern[j]:
                    break
            else:
                return i  # 返回模式的起始索引
        if i < n - m:
            t = (d * (t - ord(text[i]) * h) + ord(text[i + m])) % prime
            if t < 0:
                t += prime
    return -1  # 如果未找到,返回 -1

# 示例输入
text = "abcabcabc"
pattern = "abc"
prime = 101
d = 256

# 示例输出
index = rabin_karp_search(text, pattern, prime, d)
print(f"Pattern found at index {index}")  # 输出: Pattern found at index 0

有限自动机搜索

有限自动机搜索通过构建一个确定性有限自动机(DFA)来加速模式匹配过程。DFA 根据当前状态和输入字符决定下一个状态。

示例代码
def compute_transition_function(pattern, alphabet):
    m = len(pattern)
    tf = [[0] * (len(alphabet) + 1) for _ in range(m + 1)]
    for state in range(m + 1):
        for x in alphabet:
            k = min(m + 1, state + 2)
            k -= 1
            while k > 0 and not (pattern[:k] == pattern[state - k + 1:state] + x):
                k -= 1
            tf[state][ord(x)] = k
    return tf

def finite_automaton_search(text, pattern):
    alphabet = set(text)
    tf = compute_transition_function(pattern, alphabet)
    n = len(text)
    m = len(pattern)
    state = 0
    for i in range(n):
        state = tf[state][ord(text[i])]
        if state == m:
            return i - m + 1  # 返回模式的起始索引
    return -1  # 如果未找到,返回 -1

# 示例输入
text = "abcabcabc"
pattern = "abc"

# 示例输出
index = finite_automaton_search(text, pattern)
print(f"Pattern found at index {index}")  # 输出: Pattern found at index 0

KMP 算法

KMP 算法通过预处理模式来加速模式匹配过程。它使用部分匹配表(Prefix Function)来避免不必要的比较。

示例代码
def compute_lps_array(pattern):
    m = len(pattern)
    lps = [0] * m
    length = 0
    i = 1
    while i < m:
        if pattern[i] == pattern[length]:
            length += 1
            lps[i] = length
            i += 1
        else:
            if length != 0:
                length = lps[length - 1]
            else:
                lps[i] = 0
                i += 1
    return lps

def kmp_search(text, pattern):
    n = len(text)
    m = len(pattern)
    lps = compute_lps_array(pattern)
    i = 0  # 文本的索引
    j = 0  # 模式的索引
    while i < n:
        if pattern[j] == text[i]:
            i += 1
            j += 1
        if j == m:
            return i - j  # 返回模式的起始索引
        elif i < n and pattern[j] != text[i]:
            if j != 0:
                j = lps[j - 1]
            else:
                i += 1
    return -1  # 如果未找到,返回 -1

# 示例输入
text = "abcabcabc"
pattern = "abc"

# 示例输出
index = kmp_search(text, pattern)
print(f"Pattern found at index {index}")  # 输出: Pattern found at index 0

Boyer-Moore 算法

Boyer-Moore 算法通过从右向左比较字符来加速模式匹配过程。它使用坏字符规则和好后缀规则来跳过不必要的比较。

示例代码
def bad_character_heuristic(pattern, m):
    bad_char = [-1] * 256
    for i in range(m):
        bad_char[ord(pattern[i])] = i
    return bad_char

def boyer_moore_search(text, pattern):
    n = len(text)
    m = len(pattern)
    bad_char = bad_character_heuristic(pattern, m)
    s = 0  # s 是模式在文本中的位置
    while s <= n - m:
        j = m - 1
        while j >= 0 and pattern[j] == text[s + j]:
            j -= 1
        if j < 0:
            return s  # 返回模式的起始索引
        s += max(1, j - bad_char[ord(text[s + j])])
    return -1  # 如果未找到,返回 -1

# 示例输入
text = "abcabcabc"
pattern = "abc"

# 示例输出
index = boyer_moore_search(text, pattern)
print(f"Pattern found at index {index}")  # 输出: Pattern found at index 0

搜索算法:问题与解答

问题 1:在未排序的数组中查找特定元素

解答

使用无序线性搜索算法,遍历数组中的每个元素,直到找到目标元素。

示例代码
def linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i  # 返回目标元素的索引
    return -1  # 如果未找到,返回 -1

# 示例输入
arr = [4, 2, 7, 1, 9, 3]
target = 7

# 示例输出
index = linear_search(arr, target)
print(f"Element {target} found at index {index}")  # 输出: Element 7 found at index 2

问题 2:在已排序的数组中查找特定元素

解答

使用二分搜索算法,通过不断将搜索区间一分为二来查找目标元素,时间复杂度为 O(log⁡n)。

示例代码
def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid  # 返回目标元素的索引
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1  # 如果未找到,返回 -1

# 示例输入
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
target = 5

# 示例输出
index = binary_search(arr, target)
print(f"Element {target} found at index {index}")  # 输出: Element 5 found at index 4

问题 3:在文本中查找特定模式

解答

使用 KMP 算法,通过预处理模式来加速模式匹配过程。KMP 算法使用部分匹配表(Prefix Function)来避免不必要的比较。

示例代码
def compute_lps_array(pattern):
    m = len(pattern)
    lps = [0] * m
    length = 0
    i = 1
    while i < m:
        if pattern[i] == pattern[length]:
            length += 1
            lps[i] = length
            i += 1
        else:
            if length != 0:
                length = lps[length - 1]
            else:
                lps[i] = 0
                i += 1
    return lps

def kmp_search(text, pattern):
    n = len(text)
    m = len(pattern)
    lps = compute_lps_array(pattern)
    i = 0  # 文本的索引
    j = 0  # 模式的索引
    while i < n:
        if pattern[j] == text[i]:
            i += 1
            j += 1
        if j == m:
            return i - j  # 返回模式的起始索引
        elif i < n and pattern[j] != text[i]:
            if j != 0:
                j = lps[j - 1]
            else:
                i += 1
    return -1  # 如果未找到,返回 -1

# 示例输入
text = "abcabcabc"
pattern = "abc"

# 示例输出
index = kmp_search(text, pattern)
print(f"Pattern found at index {index}")  # 输出: Pattern found at index 0

问题 4:在哈希表中查找特定键

解答

使用哈希表的搜索方法,通过哈希函数将键映射到表中的位置,然后查找该位置的链表或开放定址法中的下一个位置。

示例代码
class HashTable:
    def __init__(self, size=10):
        self.size = size
        self.table = [[] for _ in range(size)]

    def _hash(self, key):
        return hash(key) % self.size

    def insert(self, key, value):
        index = self._hash(key)
        for item in self.table[index]:
            if item[0] == key:
                item[1] = value
                return
        self.table[index].append([key, value])

    def search(self, key):
        index = self._hash(key)
        for item in self.table[index]:
            if item[0] == key:
                return item[1]
        return None

# 示例输入
hash_table = HashTable()
hash_table.insert("apple", 5)
hash_table.insert("banana", 7)
hash_table.insert("cherry", 3)

# 示例输出
print(hash_table.search("banana"))  # 输出: 7

问题 5:在字符串中查找多个模式

解答

使用 Aho-Corasick 算法,通过构建一个模式匹配机来同时查找多个模式。Aho-Corasick 算法结合了 KMP 算法和 Trie 树的优点,能够高效地处理多个模式的匹配问题。

示例代码
class TrieNode:
    def __init__(self):
        self.children = {}
        self.is_end_of_word = False
        self.fail = None  # 失败指针

class AhoCorasick:
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_end_of_word = True

    def build_fail_pointers(self):
        queue = []
        node = self.root
        for child in node.children.values():
            child.fail = self.root
            queue.append(child)
        while queue:
            rnode = queue.pop(0)
            for (key, child) in rnode.children.items():
                queue.append(child)
                fail_node = rnode.fail
                while fail_node and key not in fail_node.children:
                    fail_node = fail_node.fail
                child.fail = fail_node.children[key] if fail_node else self.root
                child.is_end_of_word = child.is_end_of_word or child.fail.is_end_of_word

    def search(self, text):
        node = self.root
        results = []
        for i in range(len(text)):
            while node and text[i] not in node.children:
                node = node.fail
            if not node:
                node = self.root
                continue
            node = node.children[text[i]]
            temp = node
            while temp:
                if temp.is_end_of_word:
                    results.append((i - len(self.get_word(temp)) + 1, self.get_word(temp)))
                temp = temp.fail
        return results

    def get_word(self, node):
        result = []
        while node and node != self.root:
            result.append(node.char)
            node = node.parent
        return ''.join(reversed(result))

# 示例输入
patterns = ["he", "she", "hers", "his"]
text = "ahishers"

# 示例输出
aco = AhoCorasick()
for pattern in patterns:
    aco.insert(pattern)
aco.build_fail_pointers()
results = aco.search(text)
for start, word in results:
    print(f"Pattern '{word}' found at index {start}")

总结

本章详细介绍了多种搜索算法,包括线性搜索、二分搜索、插值搜索、符号表和哈希表、字符串搜索算法等。每种算法都有其适用场景和性能特点。通过理解这些算法的原理和实现,可以更好地选择合适的搜索算法来解决实际问题。

如何学好数据结构与算法(视频+文字版) 如何学好数据结构与算法 陈小玉 《趣学数据结构》《趣学算法》作者 主题: 为什么要学数据结构 数据结构学习秘籍 算法为什么那么难 算法学习秘籍 如何打开数据结构与算法这两扇门 随着科学技术的发展,人工智能已渗透到各个行业,算法工程师非常火爆,急缺大量人才,年薪也越来越高。刚毕业30-40万很常见。很多人想入手学习算法,那么多算法,究竟该如何下手呢? 很多人看到招聘要求,算法工程师... 阅读详情

相关推荐

排序与搜索算法在Python中的应用

本文探讨了排序与搜索算法在现实世界应用中的重要性,以及它们在Python编程语言中的实现和应用。通过对图书馆目录排序、手机联系人排序、数据库管理系统优化、网络搜索引擎和GPS导航系统等场景的分析,阐述了归并排序、基数排序、插入排序、快速排序等算法的实际应用。同时,本文也提供了Python中排序算法和搜索算法的实际应用示例,展示了如何利用Python内置功能及库来高效处理数据。

weixin_42601134的博客 622

两种简单的搜索算法

搜索算法是图论中常用到的算法,这里介绍两种常用的算法。这两种算法都是是以队列为基础的。 最简单的搜索方法:迷宫搜索,这种搜索方法是从当前位置出发,向四周辐射,直到搜索到目标位置,这种搜索方法的特性是:每向前推进一步花费的步骤数(时间)是相同的,所以这种搜索方法的实现非常的简单,我们只需要将走过的地方标记,然后将符合条件的待搜索部分压入搜索队列即可。这里我们只需要普通队列即可。(队列的构造及使用方

IOT_Change的专栏 4167

计算机网络简答题

协议定义了在两个或多个通信实体之间交换的报文格式和顺序,以及发送接收报文以及其他事件需要采取的操作。为。

m0_61636632的博客 1700

常见的几种搜索算法

目录广度优先搜索(BFS)深度优先搜索(DFS)爬山法(Hill Climbing)最佳优先算法(Best-first search strategy)回溯法 (Backtracking)分支限界算法(Branch-and-bound Search Algorithm)A*算法 广度优先搜索(BFS) 广度优先搜索算法(Breadth-First Search,BFS)是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

qq_30108237的博客 1万+

H3C VRF实验

POP-vpn-instance-RT1]route-distinguisher 11:11 # VPN实例-RT1的路由区分器值11:11。配置路由泄露,其实就是在一个VPN示例中添加另一个VPN实例的下一跳,比如在VPN实例RT1中添加去往SRV的默认路由。但是也有了一个新的问题,那就是RT1、RT2和RT3也能互访了,这让VPN实例变得没有意义了。[POP]ip vpn-instance RT1 #配置vpn实例-RT1。绑定了VPN实例,所以要把路由添加到VPN实例POP中。

m0_68698993的博客 4027

MTK平台TP驱动设备树与GPIO配置实战解析

本文详细解析了MTK平台TP驱动开发中的设备树与GPIO配置实战。通过DCT工具配置GPIO引脚,结合设备树节点定义触摸参数,并分享驱动移植、编译调试技巧及常见问题解决方案,帮助开发者快速掌握MTK触摸驱动开发核心。

ice55的博客 235

搜索算法详解

注意:正在施工,完成日期不详 注意正在施工完成日期不详 前言 纲要 DFS 深度优先搜索算法 定义 基本内容 主要思想 操作方法 典型的题 地图可达性问题 地图片区问题 普通的DFS模型 BFS 广度优先搜索算法 定义 基本内容 主要思想 操作方式 典型的题 地图可达性问题 地图的最短路问题 地图片区问题 剪枝 定义 基本内容 典型的题 记忆化搜索 定义 基本内容 主要思想 操作方法 典型的题

不写博客 9258

Oracle EBS财务模块(三)总账功能

(一)总账管理系统主要功能  总账管理系统(Oraclegeneralledger)是一个公司一切账务系统的核心,它好比是公司会计信息的中央处理器。总账管理系统提供了一个完整的财务管理核算及分析流程。它是所有子账户的信息存储器,因此反映了所有子账户的财务和现金活动。总账管理系统的主要作用是记录公司的财务活动,并生成财务报表和管理报表,以帮助公司内外人士进行决策。一个公司或组织的制造系统、项目管理系

苏南生的优快云博客 2万+

Linux zcat和zgrep命令的使用

zcat和zgrep命令都适用于非当日压缩日志文件的查看和查询 zcat 打开压缩日志文件 zcat xxx.zip 免解压打开指定压缩日志文件 zcat xxx.zip | grep ‘老北京卤煮’ 指定查询条件查找 zgrep 指定查询条件,实现不解压日志文件查询 zgrep ’ 查询条件’ xxx.zip 同普通log文件的查找 grep ‘查询条件’ xxx.log ...

weixin_44407691的博客 4748

Ubuntu虚拟机磁盘扩容实战:5分钟搞定gparted分区调整(附常见错误修复)

本文详细介绍了在Ubuntu虚拟机中使用gparted工具进行磁盘扩容的实战步骤。针对常见的交换分区阻碍问题,提供了从禁用交换空间、删除旧分区、调整主分区大小到重建交换分区并更新系统配置的完整解决方案,帮助用户在5-10分钟内安全高效地解决磁盘空间不足的难题。

1a2s3d4f5g的博客 670

Unity WebView 插件⭐️(十八)3D WebView 原生2D模式 — Native 2D Mode

Unity中的 浏览器插件:3D WebView,利用好该插件我们可以自己使用Unity打造出一个自定义的多样化浏览器。可以用于2D显示,也可以用于3D空间场景中使用,在PC端、手机端和VR设备等都可以有一个非常好的效果。一起来浏览器插件:3D WebView的专栏学习使用吧!

努力前行,总会成为自己心中的那道光 7640

常见的搜索算法

一些常见的搜索算法

贾继康的博客 3114

【开源电机驱动】位置环控制

这是三闭环里的最后一个:位置闭环控制。如果你认真的阅读并推导了前章节,那么这一节将会很好理解。一如既往,我会使用简练的语言来描述复杂的问题。本章节主要涉及位置环的一些概念,以及控制框图。文章不会涉及具体的代码。

BadBoyHolly的博客 6097

【读书笔记】算法神探

今年4月读的第二本书:算法神探。以侦探小说的形式,简要介绍了基于不同的数据结构,多种搜索算法的原理和实现。文笔诙谐幽默,算法的应用场景形象生动,回归基础,深入浅出,让人记忆深刻。 转载于:https://www.cnblogs.com/brigth-9V/p/8929778.html...

banchan2145的博客 192

GEE APP:基于GEE的红树林监测平台

本文将介绍如何利用Google Earth Engine平台,结合Landsat系列卫星影像和SRTM高程数据,实现红树林分布的动态监测与变化分析。

此星光明博客 160

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java算法常见面试题及答案

随着疫情的好转,各大企业公司纷纷开始复工,招聘也将迎来一个高峰。Java程序员想要在这次疫情后,拿到满意的offer,就必须做好充足的准备。众所周知,算法可以说是大厂面试Java程序员的必问面试题。相信算法的重要性大家都了解,好的算法可以让性能得到万倍提升,做到毫秒级处理千万数据的程度。因此,为了提升大家在面试中的底气,本文整理了一些Java程序员算法面试题并比附上了答案,一起来看看吧! Java算法常见面试题及答案1、算法的时间复杂度时候是什么?答案:算法的时间复杂度表示程序运行完成所需的总时间,它通常用

java364100的博客 9594

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

程序员小灰的漫画算法

转载自微信号程序员小灰,不定期更新,漫画讲解好评,特来转载。漫画知识汇总漫画:深度优先遍历 和 广度优先遍历漫画:什么是 “图”?(修订版)漫画:图的 “最短路径” 问题漫画:Dijkstra 算法的优化漫画:图的 “多源” 最短路径漫画:有趣的 “切蛋糕“ 问题漫画:什么是 HTTPS 协议?漫画:什么是ConcurrentHashMap?漫画:高并发下的HashMap漫画:什么是HashMa...

yingjian2215的博客 640

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

探索Rank-BM25:两行代码实现搜索引擎

在这个信息爆炸的时代,快速准确地找到所需的信息至关重要。为此,我们向您推荐一个简洁而强大的开源项目——Rank-BM25。这是一个基于Python的搜索算法集合,能够帮助您轻松构建属于自己的搜索引擎。 ## 项目介绍 Rank-BM25是一个轻量级的库,专注于文档检索和相关性排名。它实现了多种经典的信息检索算法,包括Okapi BM25、BM25L、BM25+等。这些算法从论文中获取,并经过了...

gitblog_00912的博客 676

探索Python数据结构与算法:解锁编程的无限可能

Python是一种简洁而强大的编程语言,它提供了广泛的数据结构和算法库,为开发者们解锁编程的无限可能。本文探索了Python中常用的数据结构和算法,旨在帮助读者深入理解并灵活运用这些工具。首先,我们介绍了Python内置的基本数据结构,如列表、元组、集合和字典,并讨论了它们的特点和适用场景。然后,我们深入研究了常见的高级数据结构,如堆、栈、队列和链表,以及它们的实现原理和应用领域。接下来,我们重点关注了Python的算法库,包括排序算法、搜索算法和图算法等。

忆~遂愿的博客 3606

点进来看看,为什么要学习【数据结构与算法】? 该如何学习?

【数据结构与算法】应该是大学计算机专业必修的一门课,为什么这门课会被列入到必修课的行列当中呢?因为对于每一个程序员来说,在以后的工作中不免要面对一些复杂的业务逻辑,同时要写对应的代码来实现这个复杂的业务。当然了,有很多种方式都可以实现同一个业务逻辑,但每种方式的代码运行效率可能不一样,我们接下来通过一个简单的例子感受一下。 例子: 假如你们班级里有一万个人,并且每个人的姓名和身份信息都存储在一个数据库中。有一天,老师突然要求你用代码实现这样一个逻辑——去这个数据库中寻找 李四 的身份信息,并输出。 在面对这

零一的博客 1万+

图搜索算法详解

图搜索算法是一种在图数据结构中寻找特定节点或路径的算法。图由节点和边组成,节点表示实体,边表示实体之间的关系。图搜索算法的目标是在图中找到从起始节点到目标节点的最优路径。名称 数据结构 空间复杂度 性质深度优先搜索 DFS 栈 stack O( h ) 其中 h 为树的高度 不具有最短性广度优先搜索 BFD 队列 queue O( 2^h ) 指数级别 具有最短性(总访问最近的点)

专注于全栈开发领域 1696

Java数据结构与算法学习路线

数据结构和算法是计算机科学的基础,它们在计算机程序中扮演着至关重要的角色。在本文中,我们将探讨Java中的常用数据结构和算法,并深入了解它们的原理、应用和实现。Java是一种广泛使用的编程语言,它具有强大的功能和易用性,使得许多程序员选择Java作为他们的主要编程语言。Java的数据结构和算法库是其强大功能的基础,它们提供了许多内置的数据结构和算法实现,使得程序员可以更轻松地解决问题。背景介绍核心概念与联系核心算法原理和具体操作步骤以及数学模型公式详细讲解具体代码实例和详细解释说明。

2301_76761656的博客 1447

Go算法与数据结构实现:从基础到高级应用

Go算法与数据结构实现:从基础到高级应用 本文全面系统地介绍了Go语言中核心算法与数据结构的实现,从基础数据结构(链表、栈、队列、树)到高级搜索算法(二分查找、插值查找、跳跃查找),再到高效排序算法(快速排序、堆排序、插入排序优化),最后深入字符串处理与数学算法的实战应用。通过详细的代码示例、性能分析和优化策略,帮助开发者掌握Go语言中算法设计与实现的精髓,提升编程能力和系统性能。 基础数据结构:...

gitblog_00807的博客 1371

《学习JavaScript数据结构与算法》核心知识点梳理

这本《学习JavaScript数据结构与算法》是前端和Node.js开发者入门数据结构与算法的经典读物。它的核心价值在于使用JavaScript这门熟悉的语言,来揭示计算机科学中基础且重要的概念。

宝青书坊 1577

【轻松掌握数据结构与算法】选择算法(中位数)

选择算法的目标是在未排序的列表中找到第 k 小的元素。当 k 等于列表长度的一半时,这个问题就变成了寻找中位数的问题。选择算法在数据处理、统计分析以及各种优化问题中都有广泛的应用。通过上述分析和示例代码,我们可以看到选择算法在不同场景下的应用和优化方法。这些算法在实际数据处理中非常有用,能够帮助我们高效地找到所需的元素。

Whoisbug的博客 1142

MTools算法可视化工具:排序与搜索算法动态演示

本文介绍了如何在星图GPU平台上自动化部署🛠️ MTools - 多功能文本工具箱镜像,以利用其内置的算法可视化工具。该工具能将抽象的排序与搜索算法(如冒泡排序、快速排序、二分搜索)转化为动态演示,为计算机专业学生和开发者提供直观、高效的学习与教学辅助。

weixin_28913879的博客 406
上一篇: 【轻松掌握数据结构与算法】排序算法
下一篇: 【轻松掌握数据结构与算法】选择算法(中位数)
Whoisbug
博客等级 码龄9年 894粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值