計數(shù)排序(Counting sort)是一種穩(wěn)定的線性時間排序算法。該算法于1954年由 Harold H. Seward 提出。計數(shù)排序使用一個額外的數(shù)組,數(shù)組的下標對應待排序的數(shù)字。然后根據(jù)新數(shù)組的下標來獲得正確的順序。就像給每個位置按數(shù)字順序做好標記,然后把對應數(shù)組放入其中,最后把下標打印出來即可。計數(shù)排序只適合數(shù)量較少的正整數(shù)排序。其算法復雜度接近于:O(N + K)
步驟是:
標準版移植自C語言版,得到最大最小值,再新建空的計數(shù)數(shù)組,長度為差值+1,再統(tǒng)計對應下標的數(shù)字,最后將計數(shù)數(shù)組逐個還原打印出來。
JS語言非常靈活好用,并不需要想C語言或Java等提前指定數(shù)組的大小,因此也沒有必要利用減少min來標記數(shù)據(jù)。整體思路就是利用下標統(tǒng)計對應的數(shù)字,然后按照下標取出數(shù)字來即可。代碼量非常少,也很簡單易懂。
過了解JavaScript的構建塊以及它們是如何工作的,將能夠編寫更好的代碼和應用程序。據(jù) GitHut 統(tǒng)計 數(shù)據(jù)所示,在GitHub中的活動存儲庫和總推送方面,JavaScript處于頂部。它也不落后于其他類別。
如果項目越來越依賴于 JavaScript,這意味著開發(fā)人員必須利用語言和生態(tài)系統(tǒng)提供的所有內容,對內部進行更深入的了解,以便構建出色的軟件。事實證明,有很多開發(fā)人員每天都在使用JavaScript,但卻不知道背后發(fā)生了什么。
幾乎每個人都已經(jīng)聽說過 V8 引擎,大多數(shù)人都知道 JavaScript 是單線程的,或者它使用的是回調隊列。本文詳細介紹這些概念,并解釋 JavaScrip 實際如何運行。通過了解這些細節(jié),你將能夠適當?shù)乩盟峁┑?API 來編寫更好的、非阻塞的應用程序。
JavaScript引擎的一個流行示例是Google的V8引擎。例如,在Chrome和Node.js中使用V8引擎,下面是一個非常簡化的視圖:
V8引擎由兩個主要部件組成:
有些瀏覽器的 API 經(jīng)常被使用到(比如說:setTimeout),但是,這些 API 卻不是引擎提供的。那么,他們是從哪兒來的呢?事實上這里面實際情況有點復雜。
所以說還有很多引擎之外的 API,我們把這些稱為瀏覽器提供 API 稱為 Web API,比如說 DOM、AJAX、setTimeout等等。
然后我們還擁有如此流行的事件循環(huán)和回調隊列。
JavaScript是一種單線程編程語言,這意味著它只有一個調用堆棧。因此,它一次只能做一件事。
調用棧是一種數(shù)據(jù)結構,它記錄了當前程序中的位置。如果運行到一個函數(shù),它就會將其放置到棧頂,當從這個函數(shù)返回的時候,就會將這個函數(shù)從棧頂彈出,這就是調用棧做的事情。
來個例子:
當程序開始執(zhí)行的時候,調用棧是空的,然后,步驟如下:
每一個進入調用棧的都稱為調用幀。
這能清楚的知道當異常發(fā)生的時候堆棧追蹤是怎么被構造的,堆棧的狀態(tài)是如何的,讓我們看一下下面的代碼:
如果這發(fā)生在 Chrome 里(假設這段代碼是在一個名為 foo.js 的文件中),那么將會生成以下的堆棧追蹤:
"堆棧溢出",當你達到調用棧最大的大小的時候就會發(fā)生這種情況,而且這相當容易發(fā)生,特別是在你寫遞歸的時候卻沒有全方位的測試它。我們來看看下面的代碼:
當引擎開始執(zhí)行這段代碼時,它首先調用函數(shù)“foo”。然而,這個函數(shù)是遞歸的,并且在沒有任何終止條件的情況下開始調用自己。因此,在執(zhí)行的每一步中,相同的函數(shù)都會被一次又一次地添加到調用堆棧中,如下所示:
然而,在某些時候,調用堆棧中的函數(shù)調用數(shù)量超過了調用堆棧的實際大小,瀏覽器決定采取行動,拋出一個錯誤,它可能是這樣的:
在單個線程上運行代碼很容易,因為你不必處理在多線程環(huán)境中出現(xiàn)的復雜場景——例如死鎖。
但是在一個線程上運行也非常有限制,由于 JavaScript 只有一個調用堆棧,當某段代碼運行變慢時會發(fā)生什么?
當調用堆棧中的函數(shù)調用需要花費大量時間來處理時會發(fā)生什么情況? 例如,假設你希望在瀏覽器中使用JavaScript進行一些復雜的圖像轉換。
你可能會問-為什么這是一個問題?問題是,當調用堆棧有函數(shù)要執(zhí)行時,瀏覽器實際上不能做任何其他事情——它被阻塞了,這意味著瀏覽器不能呈現(xiàn),它不能運行任何其他代碼,它只是卡住了,如果你想在應用中使用流暢的頁面效果,這就會產(chǎn)生問題。
那么,怎樣才能在不阻塞UI和不使瀏覽器失去響應的情況下執(zhí)行大量代碼呢?解決方案是異步回調。
信在學校的你都有這樣的體驗,臨近考試,必然要瘋狂的“背誦”、“速記”,否則成績單就要掛零,因為答題卡全部涂抹并不能得高分。
那么畢業(yè)多年的你,沒有了考試,有沒有一絲懷念涂答題卡的時候,有沒有好奇這個答題卡到底如何制作,成績表到底如何為每位同學定制動態(tài)生成的。
其實,這些都要歸功于“報表”工具。
學校每年都會打印很多的學生成績單,往往因為新增的課程和不同的教學體系,導致想要的結果復雜且多變。那么如何使用一個工具就可以靈活的制作各種各樣報表,面對多變的場景,十分重要。
(答題卡)
上圖就是我們制作出來的一個答題卡報表,而且它可以根據(jù)學生數(shù)量批量加載學生的信息數(shù)據(jù),然后直接生成并且供我們打印。那它的優(yōu)勢也就顯而易見了,自己設計的答題卡,題型和題量都可以自己來選擇,靈活多變,且可以根據(jù)不同題型自己隨意更新,也可以增加很多默認數(shù)據(jù),畢竟自己設計打印的肯定也比購買的便宜。
有些人可能就想說,自己做是不是很麻煩,而且也不會用,學起來是不是還很吃力。小編就可以自信地說了,作為手殘黨的我也可以很快制作的,但是上限卻很高,隨著越發(fā)深入的使用,帶來的經(jīng)驗肯定也是越多。當你熟練制作了后,還可以關注更多的功能,不僅僅是制作顯示出來,更美觀、更多的功能才是我們的追求。
就比如下面這個報表,只需要簡單的幾步就可以實現(xiàn)。而且效果還不錯。
(最終效果展示)
首先我們要設計對應的報表,下面是報表設計的整體界面:
在左側是我們需要使用的組件,也就是設計報表需要的元素,中間就是顯示,最右側可以控制一些屬性設置和指定數(shù)據(jù)。這么一看就很清晰了,我們其實簡單的拖拽就可以實現(xiàn)所需要的報表設計,簡單方便,設計好之后可以導出下載都可以。光說這些肯定還是不夠的,那么接下來就直接上實例:
當我們統(tǒng)計學校不同學院的畢業(yè)信息時,可能需要根據(jù)從系統(tǒng)中查到數(shù)據(jù)然后拿出來,之后在自己計算所需要的數(shù)據(jù),然后在在Excel表中一點一點的去寫,特別時數(shù)據(jù)多點,我們的工作人員可能就會因為一張表而制作一整天。畢竟制作Excel表的痛苦大家應該都知道吧,那用wyn產(chǎn)品怎么實現(xiàn)的,手殘黨福利來了:
只需要簡單的綁定需要的數(shù)據(jù),然后把要顯示的直接拖到頁面上,然后寫幾個表達式。完成,可能本來一天的工作量,現(xiàn)在幾個小時就OK了,是不是很誘惑啊??梢钥聪旅鎯蓚€圖,第一個是設計界面,第二個是預覽成果。
(設計界面)
(表格展示)
沒錯,就是簡單的綁定這么幾列數(shù)據(jù),然后他就會根據(jù)我們數(shù)據(jù)源有的數(shù)據(jù)進行自動計算,自動擴展行展示。是不是很簡單。
那么答題卡的樣子上面大家已經(jīng)看到了,那有人問了,我們學生人很多啊,我不可能真的一個一個設計吧,就算只是一直復制粘貼,也很費時間。那在怎么解決呢,很簡單這里只要綁定好數(shù)據(jù)的話,設置按人的分組,那他就會自動加載所有學生的了,而且對應的信息也對對應過來,這個時候我們打印就可以批量打印,并且不同學生顯示不同信息。這種場景其實也可以應用在很多場景下,比如打印學生的準考證,學生的成績單等等,其實都是需要批量打印的,那用這個產(chǎn)品就可以實現(xiàn)相同模板的批量打印。
除了教師使用的,當然也有學生使用的啦,就比如我們最常見的成績單。
那么針對不同學生我們需要的是不同的成績單,那這里就有個需求就是不同學生看不同的信息,自己查詢自己的成績單,自己打印自己的成績單,那其實就像當于一個篩選。針對多變且不同的課程,往往很復雜,不同學生信息不同怎么辦,那么使用wyn產(chǎn)品的就可以設計統(tǒng)一的樣式,然后我們通過參數(shù)篩選,就可以篩選出來自己的信息。比如我們通過學號查詢自己的成績單,就可以實現(xiàn)如下圖:
(學號篩選)
接下來給大家來點干貨分享,如何使用前端報表控件ARJS通過拖拉拽實現(xiàn)大學成績績效表的設計。
1、 首先我們來解析下這張報表
該表主要分為三個部分:
表頭:也是就是學生基礎信息,包括學習:姓名、學院、專業(yè)、學號、班級、學歷、畢業(yè)證號
(學生信息)
明細部分:顯示大學四年的考試績效成績,包含學期、課程名稱、學分、成績
明細部分你自己看發(fā)現(xiàn)其實是三個相同的模塊
(模塊細分)
表尾部分:表尾部分主要是學分的統(tǒng)計、平均成績、平均績點
(表尾部分)
2、 拆分完這張表之后,那么就可以根據(jù)實際需求進行報表的設計
首先給報表添加頁眉和頁腳,頁眉中通過文本框來設置表頭需要顯示的信息表頭和頁腳通過文本框來進行表尾的顯示設計。
中間內容區(qū)域,首先使用表格控件,然后利用表格控件的分組,分組條件根據(jù)綁定數(shù)據(jù)的中的數(shù)據(jù)字段學年和學期進行分組。
(表設計)
明細內容是三個相同的模塊,也就是在一個內容區(qū)域顯三個相同區(qū)域,那么這可以使用報表字段的分欄屬性來設置。
(分欄屬性設置)
3、 最終設計好的報表設計樣式
(最終效果展示)
4、 最終預覽結果:
(預覽展示)
5、 報表模板
相信能看到這里的小伙伴肯定也已經(jīng)躍躍欲試了,這里我們?yōu)榇蠹姨峁┝硕嗄0蹇梢試L試,歡迎搜索并訪問葡萄城官網(wǎng),了解更多。
*請認真填寫需求信息,我們會在24小時內與您取得聯(lián)系。