1. 程式人生 > >利用二叉樹特性優化省市鎮三級聯動效能

利用二叉樹特性優化省市鎮三級聯動效能

省市鎮存入資料庫一張表Area:

ID

Name

ParentID

1

廣東

null

2

廣州

1

3

雲浮

1

4

白雲區

2

5

天河區

2

6

廣西

null

7

河池

6

如果是這樣的話,要查天河區是哪個省的,需要連結串列查詢:

selectProvince.*from Area Province
inner join Area City on City.ParentID =Province.ID
inner join Area Town on Town.ParentID =City.ID
where

Town.Id='5'

如果一個頁面上出現這樣的篩選很頻繁,則會加慢速度。

解決辦法可以很多,加快取,但如果要優化資料庫查詢,則需要對這個表做些手腳,怎麼做呢?

1.這裡我們要明確的是要解決的問題是什麼:是怎樣能提高根據父級節點查詢子樹的速度。

2.根據二叉樹儲存節點值的特性:每個節點值總是小於其右子樹的節點值。也就是說節點值有記錄子樹節點值範圍的作用。利用這點,我們可以構造類似的樹:

(要注意的是,這個節點值,跟省市鎮的id是不同的概念,是沒有關係的)



3.也就是說,這種做法,是要一次性全體定死左右屬性值的。不過這也不是大問題,省市鎮的資料改動少,需要改動的時候,再全體Update一次。這就是折優的方案。
具體實現的程式碼我就不貼了,提供了思路,希望讀者自己去敲下來,加深理解。

相關推薦

利用特性優化市鎮三級聯動效能

省市鎮存入資料庫一張表Area: ID Name ParentID 1 廣東 null 2 廣州 1 3 雲浮 1 4 白雲區 2 5 天河區 2 6 廣西 null 7 河池 6

JavaScript中利用對陣列進行排序

二叉樹和二叉搜尋樹 二叉樹中的節點最多隻能有兩個子節點:一個是左側子節點,另一個是右側子節點。 二叉搜尋樹(BST)是二叉樹中的一種,但是它只允許在左側節點儲存比父節點小的值,在右側幾點儲存比節點大(或相等)的值。 可以利用BST的這種特性,對陣列進行排序: class Node{

利用設計一款簡單的huffman編碼器

從磁碟讀入一個僅包括英文字母及標點符號的文字檔案(如f1.txt),統計各字元的頻度,據此構建huffman樹,對各字元進行編碼,並將字符集,頻度集及相應編碼碼字集輸出在顯示器或儲存在另一個文字檔案(如 f1_code.txt)中. 思路: Void Huffman

利用求解表示式的值

#include<stdio.h> #include<stdlib.h> #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define STACK_INIT_SIZE 100 #define STACKINCREME

利用的非遞迴後序遍歷求解最近公共祖先問題

通過上一篇的部落格我們知道,可以利用棧來實現二叉樹的後序遍歷。其實這裡有一個性質,就是當使用非遞迴後序遍歷時,棧中的元素就是當前節點到根節點的路徑。利用這個規律,我們就可以求解最近公共最先問題了。 演算法 找出兩個節點各自到根節點的路徑。這裡利

利用的排序演算法c#實現

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 利用二叉樹的排序演算法 {     public class Tree     {

【資料結構__Tree_0982】利用儲存普通的度

Problem:資料結構中樹的度是什麼? Answer:樹內各結點的度的最大值.(結點擁有的子樹數稱為結點的度). 一個元素的度是指其孩子的個數;葉結點的度為0;一棵樹的度是其元素的度的最大值;

利用遍歷思想解決問題】

*Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reserved. *檔名稱: *作 者:李佳駿 *完成日

統計利用儲存的森林中的棵數

普通樹及其構成的森林均可轉換成相應的二叉樹,反之亦然。故而可以根據相應的轉換方法去統計某一二叉樹對應的森林中樹的棵數。相應的二叉樹可利用先序遞迴遍歷演算法建立。先序遞迴遍歷建立二叉樹的方法為:按照先序遞迴遍歷的思想將對二叉樹結點的抽象訪問具體化為根據接收的資料決定是否產生該結

輸出利用儲存的普通的度

普通樹可轉換成相應的二叉樹(該二叉樹的根結點一定缺少右兒子),反之亦然。故而可以根據相應的轉換方法去統計某一二叉樹對應的普通樹的度。普通樹的度為其結點兒子數的最大值。相應的二叉樹可利用二叉樹的先序遞迴遍

c/c++實現利用的先序遍歷和中序遍歷序列重建樹

先序遍歷中第一個結點必然是根結點,利用該結點在中序遍歷中的位置,將樹分為左子樹和右子樹,然後遞迴重建左子樹和右子樹,程式碼如下#include <iostream> using names

第九周專案三C/C++利用遍歷思想解決問題

/* *Copyright (c) 2017,煙臺大學計算機與控制工程學院 *All rights reserved. *檔名稱:.cpp *完成日期:2017年11月16日 *版 本 號:v1.0 * 利用二叉樹遍歷思想解決問題 /* 【利

基於layui的市鎮三級聯動js

今天做表單的時候用到省市鎮三級聯動,用著layui的這一套,那就還是用layui吧,有現成的我就不想自己寫了,所以我就找到了layui已經出來的,最新的2018年4月27日更新第二版 html:   <!DOCTYPE html> <html> &

[Leetcode] Construct binary tree from inorder and postorder travesal 利用中序和後續遍歷構造

post right clas end opened tree 數組 isp solution Given inorder and postorder traversal of a tree, construct the binary tree. Note: You ma

C++實現利用(前序和中序生成)以及(的鏡像)

lse pub 非遞歸 ace 方法 [] reorder spa push #include<iostream> #include<string.h> #include<stack> using namespace std; type

【資料結構週週練】015 利用遞迴演算法建立鏈式儲存的並轉換左右孩子結點

一、前言 哈哈,今天就是程式設計師節啦,祝大家1024程式設計師節快樂。 今天要給大家分享的演算法是交換二叉樹是的左右孩子結點,比較簡單,需要建立一個結點用來暫存左孩子結點,下面給大家送上程式碼。 二、題目 將下圖用二叉樹存入,並交換二叉樹是的左右孩子結點。其中圓角矩形內為結點資

【資料結構週週練】014 利用棧和非遞迴演算法求鏈式儲存的是否為完全

一、前言 首先,明天是個很重要的節日,以後我也會過這個節日,在這裡,提前祝所有程式猿們,猿猴節快樂,哦不,是1024程式設計師節快樂。 今天要給大家分享的演算法是判斷二叉樹是否為完全二叉樹,相信大家對完全二叉樹的概念並不陌生,如果是順序儲存就會很方便,那鏈式儲存怎麼判斷呢,我的做法是:若

【資料結構週週練】013 利用棧和非遞迴演算法求的高

一、前言 二叉樹的高是樹比較重要的一個概念,指的是樹中結點的最大層數本次演算法通過非遞迴演算法來求得樹的高度,借用棧來實現樹中結點的儲存。 學英語真的很重要,所以文中的註釋還有輸出以後會盡量用英語寫,文中出現的英語語法或者單詞使用錯誤,還希望各位英語大神能不吝賜教。 二、題目 將

【資料結構週週練】012 利用佇列和非遞迴演算法實現的層次遍歷

一、前言 二叉樹的遍歷是比較多樣化的遍歷,有很多種遍歷方式,先序遍歷,中序遍歷,後序遍歷,層次遍歷等等。本次給大家講的是層次遍歷,為了方便,我將題目中的資料改為編號,從左往右,從上往下依次遍歷。方便大家看到結果。 二、題目 將下圖用二叉樹存入,並通過層次遍歷方式,自上而下,從左往右對

----資料結構:的三種遍歷,利用遞迴演算法。

二叉樹----資料結構:二叉樹的三種遍歷,利用遞迴演算法。     魯迅:總之歲月漫長,然而值得等待。   #define CHAR /* 字元型 */  /* #define INT /* 整型(二者選一) */  #