Excel / SharedStrings için sıralama algoritması


10

Excel'de, dizeleri sayısal bir eşlemeye 'sıkıştırırlar (bu durumda sıkıştırma kelimesinin doğru olduğundan emin değilim). Aşağıda gösterilen bir örnek:

resim açıklamasını buraya girin

Bu, genel dosya boyutu ve bellek kapladığı alanı azaltmaya yardımcı olsa da, Excel bir dize alanında sıralama nasıl yapar? Her bir dizenin arama eşlemesinden geçmesi gerekir mi: eğer öyleyse, bir dize alanında sıralama yapma / yavaşlatma maliyetini büyük ölçüde artırmazdı (1M değerleri olsaydı, 1M anahtar aramaları olmazdı) önemsiz). Bu konuda iki soru:

  1. Paylaşılan dizeler Excel uygulamasının içinde mi yoksa yalnızca verileri kaydederken mi kullanılıyor?
  2. Sahada sıralamak için örnek bir algoritma ne olurdu? Herhangi bir dil iyidir (c, c #, c ++, python).

Bu konuda bilgili bir cevapla da ilgileneceğim. Sadece bellek önbellekleme ile ilgili bir şey olduğunu tahmin edebilirim ama kolayca yanlış olabilir.
PeterT

Bu eşlemenin bir belgenin fiziksel XML gösterimi içinde mevcut olması, Excel'in dahili olarak çalışma zamanında verileri nasıl temsil ettiğinden bağımsız olduğunu düşünüyorum. (Bu birçok şekilde yapılabilir olsa da) veri sütunlarını ham bir şekilde temsil etmenin daha hesaplama açısından verimli olduğuna inanıyorum.
alxrcs

@alxrcs, SQLServer için böyle bir şeye benzer şekilde, Excel'in içine giren herhangi bir belge veya kitap var mı? amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/… , yoksa temelde ms ekibinin dışında bir kara kutu mu?
David542

Emin değilim, üzgünüm. Dosya biçimleri için çevrimiçi olarak bazı özellikler bulabilirsiniz, ancak Excel çalışma zamanı iç kısımlarındaki ayrıntıların bulunmasının bu kadar kolay olduğunu düşünmüyorum.
alxrcs

Her neyse, ikinci sorunuzdan, teoriyle Excel özelliklerinden daha fazla ilgilendiğinizi sanıyorum, doğru mu?
alxrcs

Yanıtlar:


0

Excel'in SharedStringTableçalışma zamanında bellekte öğeler içeren hücreleri tam olarak nasıl saklayacağını bulamıyorum , ancak öğelerin bir dizini olarak saklamak SharedStringTable, öğelerin bir dizi olarak saklandığı varsayılarak, bunlara erişmek için yalnızca bir ek dereference gerektirir. Benim tahminim bu böyle yapılıyor. Bu en basit yol ve daha hızlı yapmanın tek yolu, SharedStringTablezaten öğelere göre sıralanmış çalışma zamanı temsiline sahip olmaktır . Böyle bir durumda bir dizine göre sıralama, değere göre sıralama ile eşdeğerdir. Bununla birlikte, bu yaklaşım, ekleme işlemini, tablonun ortasına yeni bir dize eklendiğinde, artması gerektiğinden daha büyük tüm dizinler ve belgedeki bu tür hücrelerin sayısı çok fazla olabileceği gibi maliyetli hale getirir. ilgili hücreler SharedStringTable.

Hücreler dosyadakilerle aynı indeksleri içeriyorsa, columnValuevektörde temsil edilen hücreleri vektörde depolandıkları işaretlere sharedStrings(fark olmadığı söylendiğinden C ++ 'da) göre 2 maliyetle nasıl sıralayacağınız aşağıda açıklanmıştır karşılaştırma işlemi başına ekstra dereferences:

// sort indexes from columnValue based on comparing values in sharedStrings
sort(columnValue.begin(), columnValue.end(), 
     [&sharedStrings](size_t i1, size_t i2){return sharedStrings[i1] < sharedStrings[i2];});

OP'de değildi, ancak geriye doğru SharedStringTablearama işlemi yavaş ve bir sözlüğe önbellekleme öğeleri yardımcı oluyor.


0

Microsoft Excel Paylaşılan Dizeler Tablosu

Paylaşılan dizeler tablosu ve ISO standardı tarafından tanımlanan Açık XML standardıdır - ISO / IEC 29500-1: 2016 (E)

Paylaşılan dizelerin resmi tanımı (ISO belgesinden alıntı)

Paylaşılan Dize Tablosu

Dize değerleri doğrudan elektronik tablo hücre öğelerinin içinde saklanabilir; bununla birlikte, aynı değerin birden fazla hücre elemanı içinde depolanması çok büyük çalışma sayfası Parçaları ile sonuçlanabilir ve bu da performansın düşmesine neden olabilir. Paylaşılan Dize Tablosu, çalışma kitabında paylaşılan ve uygulamaların değerleri yalnızca bir kez saklamasına izin veren, dizine eklenmiş dizin değerlerinin listesidir.

Paylaşılan Dizelerdeki ISO standardı şu adresten indirilebilir:

https://standards.iso.org/ittf/PubliclyAvailableStandards/c071691_ISO_IEC_29500-1_2016.zip

Bu konuyla ilgili soruların cevapları

Soru 1: Paylaşılan dizeler Excel uygulamasının içinde mi yoksa yalnızca verileri kaydederken mi kullanılıyor?

Yanıt: Paylaşılan dizeler Excel tarafından yalnızca belgenin IE kaydedildiği sırada, yalnızca e-tabloyu depoda bir dosya olarak saklamak amacıyla kullanılır.

Ancak, dosya görüntüleme için açıldığında, hücreler paylaşılan dizeler tablosundan alınan gerçek dize değerleri ile doldurulur.

-

Soru 2: Sahada sıralamak için örnek bir algoritma ne olurdu? Herhangi bir dil iyidir (c, c #, c ++, python).

Cevap: Excel gibi bir uygulama için, özel hızlı Quick sort varyasyonunun dize değerlerinde sıralama için kullanılacak en olası algoritma olduğunu düşünüyorum.

Excel'in 1.048.576 satır sınırı vardır. Bu boyut için Hızlı sıralama kesinlikle kazanır. Hızlı sıralama, bu büyüklükteki veri kümesi için çok verimli sonuç verebilir.

Dizeleri sıralama için C ++ Hızlı Sıralama uygulamasına bağlantı:

http://www.cplusplus.com/forum/beginner/101599/


2
hızlı sıralama dizginin kendisinde olurdu, bir işaretçiyi kaldırmanız veya milyon kez bir arama haritası yapmanız gerekir, hayır? Bence bu cevap temelde "Evet, Paylaşılan Dizeler yapıyor. İşte paylaşılan dizeler olmadan bir tür nasıl yapılır" diyor.
David542

2
Paylaşılan dizeler tablosu yalnızca dosya içeriğini diske depolamak için kullanılır. ISO standardı, uygulama açıkken hücrelerin nasıl doldurulması gerektiğini belirtmez. Hücreler, paylaşılan dizeler tablosundan çıkarılan dize değerinin kopyası ile doldurulursa, kayıt silme işlemi önlenebilir.
Gopinath

1
Anlıyorum. Evet, buradaki ana ilgi alanım, bellekte, depolama alanına / depolama alanının dışında nasıl ele alındığıydı. Bu kısmı hakkında bir fikriniz var mı?
David542

Excel sıralamasında, kullanıcı sıralama düzenini sütun listesi olarak belirtmelidir (Örnek: A Sütununa Göre Sırala, Sonra B'ye, Sonra C'ye, Sonra D'ye göre sıralayın). A sütununun yinelenen dizeler içerdiğini varsayalım. Sıralama sırasında, A sütunu için aynı değere sahip tüm satırlar 'B Sütunu' değerlerine göre sıralanır. B hücreleri de yinelenen değerler içeriyorsa, benzersiz değerler içeren sütun bulunana kadar sıralama C Sütununda yapılır. Sütunlardan hiçbirinin benzersiz değerleri yoksa, satırlar atlanır.
Gopinath
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.